理解javascript中的this

一直以来,对javascript里面的this总是云里雾里,虽然平时就那么糊里糊涂的用也没问题。但是,自己既然要往前端方向发展,就不能对this不求甚解。

所以,趁着下午有时间,通过看书,查资料,对this有了一些深入的了解。

首先,我们得牢记一个结论:this的指向,是在函数被调用的时候确定的,也就是执行上下文被创建的时候确定的,函数定义的时候确定不了。

下面来分析不同情况下,this的指向:

 

一、构造函数

所谓构造函数,就是用来new对象的函数。构造函数的函数名第一个字母大写(规则约定)。

以上的代码中,如果函数作为构造函数用,那么其中的this就代表它即将new出来的对象。

 

二、函数作为对象的一个属性

如果函数作为对象的一个属性时,并且作为对象的一个属性被调用时,函数中的this指向该对象。

以上代码中,fn不仅作为一个对象的一个属性,而且的确是作为对象的一个属性被调用。结果this就是obj对象。

 

但是,这里fn如果不是作为一个对象的属性被调用,而是被复制到另一个变量中,那么this就指向window,如下代码所示:

 

 三、函数用apply或call调用

apply和call都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。者的作用完全一样,只是接受参数的方式不太一样。

apply
Function.apply(obj,args)方法能接收两个参数:

obj:这个对象将代替Function类里this对象

args:这个是数组或类数组,apply方法把这个集合中的元素作为参数传递给被调用的函数。

call

call方法apply方法的第一个参数是一样的,只不过第二个参数是一个参数列表

 

四、全局和普通函数调用

在全局环境下,this永远是window,这个应该没有非议。

 普通函数在调用时,this也是指向window。

 

 这里要注意一个情况:函数f虽然是在obj.fn内部定义的,但是它仍然是一个普通的函数,this仍然指向window。

 

 以上就是javascript中的this的一些指向性问题,以后有新发现再补充。自己手打了一遍,主要时自己能多理解一些。

 

posted @ 2017-04-05 16:27  洋葱酱  阅读(181)  评论(0编辑  收藏  举报