今天为大家分享一篇关于JavaScript中的this对象的文章。我们都知道,this这玩意儿一直都是js中很难搞明白的点,这主要是因为它的值不固定,是根据其执行环境的情况来决定它的值,所以在使用this时,如果没搞清楚代码块的执行作用域环境,是肯定会出问题的。
那么本篇文章,将对JS中的this对象在各个情况下的值展开讨论,我总共总结9种情况,当然可能还会有其他情况,如果没有讲到,请在评论区指示,我会第一时间补上。
抛开废话,我直接如题
第一种:对象方法中的this在对象方法中,this的值就是该方法所在对象,此时this可以访问到该方法所在对象下的任意属性,来看例子:
var
上面例子中定义了一个对象,对象中有个sayName方法,调用这个方法打印的结果如下:
可以看到,打印出来的this对象的值为对象objThis,也就是sayName方法所在对象,从而此时的this能访问到该对象下的所有属性。
我们来看一下这种情况,如果sayName方法中返回了一个匿名函数,在匿名函数中访问this.name,值是什么呢?先看代码:
var
要知道,匿名函数的执行环境是全局作用域,因此这里打印出来的name属性应该是window对象下面的name属性,来看结果是否正确:
打印出了window对象下的name属性的值,看来分析是没问题的。
第二种:函数中的this函数中的this表示的是window对象,无论函数中嵌套多少层,内层函数的this同样也指的window对象,看看例子:
var
上面例子中定义了一个parent函数,其中嵌套了一个sub函数,在这两个函数体中分别访问this对象的name属性,来看看结果:
可以看到均访问到window对象中的name属性。
第三种:严格模式下函数的this严格模式下函数中的this是未定义的,因此调用this对象的时候会报未定义。我把第二种情况中的例子在严格模式下运行一遍,来看看打印结果:
因为this未定义,所以无法访问到name属性。
第四种:构造函数中的this在构造函数中,this对象表示的是该构造函数创建的实例对象。来看看下面这个例子:
var
这个例子在构造函数Fn中设置属性值为constructor,随后创建一个实例thisFn,访问其name属性,来看打印结果:
访问到的name属性值是constructor,而并非window对象中的name属性,明白对象和构造函数原理的同学就知道,当构造函数Fn创建实例对象后,该实例对象会拥有其构造函数的所有实例属性,而例子中的this.name,就指的是这个实例对象中的name属性。
第五种:匿名函数中的this上面我已经提到过,匿名函数的执行环境是全局作用域,所以其this对象指的是window对象,我再把上述第四种情况的例子中的构造函数修改一下,来看看代码:
function
构造函数Fn中返回了一个匿名函数,匿名函数中访问this对象的name属性,来看看对应结果:
结果是window对象中的name属性,再次证实了这个情况。
第六种:单独使用时的this对象this对象单独使用时,它就指的是window对象。其实换个思维想想,单独使用时是在全局作用域下访问this对象,而全局作用域对象正是window对象,所以window对象是此时this的所在对象,所以this就指的是window对象。
第七种:在事件中使用this在事件中使用this,它表示的是这个事件绑定的那个元素的Dom,来看下面的例子:
<
例子中为div元素绑定了一个click事件,当触发这个事件之后,看看打印结果:
可以看到打印出了这个div元素Dom,因此,这里的this可以访问到该元素中的所有属性。
第八钟:apply()与call()方法中apply()和call()方法都有改变this的指向,扩充函数执行作用域的功能。这两个方法中的this可以被指定引用到任何对象。来看看这个例子:
var
上面例子中分别用apply()和call()方法来测试了其this对象,来看看打印结果:
结果一样,来分析一下,sayName函数调用其apply()或call()方法时,将对象changeObj作为唯一参数传入,而这两个方法的第一个参数表示执行作用域,相当于把sayName方法移动到了对象changeObj中,所以this对象就指的是对象changeObj。
第九种:箭头函数中的this箭头函数本身是没有this的,它的this是来自其外层代码块中的this,无论箭头函数嵌套多少层,也只有一个this的存在,这个this就是它们外层代码块中的this。在ES5中的this对象指的是其执行环境对象,而箭头函数的this对象不是,它指的是其定义时所在的对象,而并非执行时所在的对象,因此它的this是固定不可变的。来看看下面这个例子:
var
上面例子中fn函数返回一个箭头函数,按照ES5来理解,可以看作为一个匿名函数,但是其this是不是window对象呢,我们来看看结果:
结果并不是window对象,而是call()方法指定的那个对象。来分析一下,箭头函数中的this指的是定义时的所在对象,在这个例子中,其定义时所在的对象正是call()方法指定的那个对象,其执行时的所在对象是window对象,所以this指的是call()指定的对象,并非window对象。
OK,this对象我就分享到这里了,如果有遗漏或者有异议,可以直接提出来,大家相互学习相互成长。