理解javascript中的this
一直以来,对javascript里面的this总是云里雾里,虽然平时就那么糊里糊涂的用也没问题。但是,自己既然要往前端方向发展,就不能对this不求甚解。
所以,趁着下午有时间,通过看书,查资料,对this有了一些深入的了解。
首先,我们得牢记一个结论:this的指向,是在函数被调用的时候确定的,也就是执行上下文被创建的时候确定的,函数定义的时候确定不了。
下面来分析不同情况下,this的指向:
一、构造函数
所谓构造函数,就是用来new对象的函数。构造函数的函数名第一个字母大写(规则约定)。
以上的代码中,如果函数作为构造函数用,那么其中的this就代表它即将new出来的对象。
二、函数作为对象的一个属性
如果函数作为对象的一个属性时,并且作为对象的一个属性被调用时,函数中的this指向该对象。
以上代码中,fn不仅作为一个对象的一个属性,而且的确是作为对象的一个属性被调用。结果this就是obj对象。
但是,这里fn如果不是作为一个对象的属性被调用,而是被复制到另一个变量中,那么this就指向window,如下代码所示:
三、函数用apply或call调用
apply和call都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。者的作用完全一样,只是接受参数的方式不太一样。
applyFunction.apply(obj,args)
方法能接收两个参数:
obj:这个对象将代替Function类里this对象
args:这个是数组或类数组,apply方法把这个集合中的元素作为参数传递给被调用的函数。
call
call方法与apply方法的第一个参数是一样的,只不过第二个参数是一个参数列表
四、全局和普通函数调用
在全局环境下,this永远是window,这个应该没有非议。
普通函数在调用时,this也是指向window。
这里要注意一个情况:函数f虽然是在obj.fn内部定义的,但是它仍然是一个普通的函数,this仍然指向window。
以上就是javascript中的this的一些指向性问题,以后有新发现再补充。自己手打了一遍,主要时自己能多理解一些。