天天看点

python 执行js 提示window未定义_JS中各个情况下的this对象

今天为大家分享一篇关于JavaScript中的this对象的文章。我们都知道,this这玩意儿一直都是js中很难搞明白的点,这主要是因为它的值不固定,是根据其执行环境的情况来决定它的值,所以在使用this时,如果没搞清楚代码块的执行作用域环境,是肯定会出问题的。

那么本篇文章,将对JS中的this对象在各个情况下的值展开讨论,我总共总结9种情况,当然可能还会有其他情况,如果没有讲到,请在评论区指示,我会第一时间补上。

抛开废话,我直接如题

第一种:对象方法中的this

在对象方法中,this的值就是该方法所在对象,此时this可以访问到该方法所在对象下的任意属性,来看例子:

var 
           

上面例子中定义了一个对象,对象中有个sayName方法,调用这个方法打印的结果如下:

python 执行js 提示window未定义_JS中各个情况下的this对象

可以看到,打印出来的this对象的值为对象objThis,也就是sayName方法所在对象,从而此时的this能访问到该对象下的所有属性。

我们来看一下这种情况,如果sayName方法中返回了一个匿名函数,在匿名函数中访问this.name,值是什么呢?先看代码:

var 
           

要知道,匿名函数的执行环境是全局作用域,因此这里打印出来的name属性应该是window对象下面的name属性,来看结果是否正确:

python 执行js 提示window未定义_JS中各个情况下的this对象

打印出了window对象下的name属性的值,看来分析是没问题的。

第二种:函数中的this

函数中的this表示的是window对象,无论函数中嵌套多少层,内层函数的this同样也指的window对象,看看例子:

var 
           

上面例子中定义了一个parent函数,其中嵌套了一个sub函数,在这两个函数体中分别访问this对象的name属性,来看看结果:

python 执行js 提示window未定义_JS中各个情况下的this对象

可以看到均访问到window对象中的name属性。

第三种:严格模式下函数的this

严格模式下函数中的this是未定义的,因此调用this对象的时候会报未定义。我把第二种情况中的例子在严格模式下运行一遍,来看看打印结果:

python 执行js 提示window未定义_JS中各个情况下的this对象

因为this未定义,所以无法访问到name属性。

第四种:构造函数中的this

在构造函数中,this对象表示的是该构造函数创建的实例对象。来看看下面这个例子:

var 
           

这个例子在构造函数Fn中设置属性值为constructor,随后创建一个实例thisFn,访问其name属性,来看打印结果:

python 执行js 提示window未定义_JS中各个情况下的this对象

访问到的name属性值是constructor,而并非window对象中的name属性,明白对象和构造函数原理的同学就知道,当构造函数Fn创建实例对象后,该实例对象会拥有其构造函数的所有实例属性,而例子中的this.name,就指的是这个实例对象中的name属性。

第五种:匿名函数中的this

上面我已经提到过,匿名函数的执行环境是全局作用域,所以其this对象指的是window对象,我再把上述第四种情况的例子中的构造函数修改一下,来看看代码:

function 
           

构造函数Fn中返回了一个匿名函数,匿名函数中访问this对象的name属性,来看看对应结果:

python 执行js 提示window未定义_JS中各个情况下的this对象

结果是window对象中的name属性,再次证实了这个情况。

第六种:单独使用时的this对象

this对象单独使用时,它就指的是window对象。其实换个思维想想,单独使用时是在全局作用域下访问this对象,而全局作用域对象正是window对象,所以window对象是此时this的所在对象,所以this就指的是window对象。

第七种:在事件中使用this

在事件中使用this,它表示的是这个事件绑定的那个元素的Dom,来看下面的例子:

<
           

例子中为div元素绑定了一个click事件,当触发这个事件之后,看看打印结果:

python 执行js 提示window未定义_JS中各个情况下的this对象

可以看到打印出了这个div元素Dom,因此,这里的this可以访问到该元素中的所有属性。

第八钟:apply()与call()方法中

apply()和call()方法都有改变this的指向,扩充函数执行作用域的功能。这两个方法中的this可以被指定引用到任何对象。来看看这个例子:

var 
           

上面例子中分别用apply()和call()方法来测试了其this对象,来看看打印结果:

python 执行js 提示window未定义_JS中各个情况下的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对象呢,我们来看看结果:

python 执行js 提示window未定义_JS中各个情况下的this对象

结果并不是window对象,而是call()方法指定的那个对象。来分析一下,箭头函数中的this指的是定义时的所在对象,在这个例子中,其定义时所在的对象正是call()方法指定的那个对象,其执行时的所在对象是window对象,所以this指的是call()指定的对象,并非window对象。

OK,this对象我就分享到这里了,如果有遗漏或者有异议,可以直接提出来,大家相互学习相互成长。