无论什么时候,javascript都会把this放到function内部 。
它是基于一种非常简单的思想——如果包含this的 (特别强调!每个函数都有this。看上面的那句话。)最近的 函数 直接是某个对象的成员。那么this的值就是这个对象。如果包含this的最近的函数 不是某个对象的成员,那么this的值便设为某种全局对象(常见为浏览器中的window对象)。
下面的内部函数可以清晰的看出这种思想。
一个函数,若是分配到某个变量的,即不属于任何对象下的一员,那么this的参数就变为window对象。
var obj = { toString:function(){//重写toString函数。这里说明下,默认情况下,Object对象都有一个toString的方法。 return "obj的范围内"; }, func:function(){ alert(this);//这里的函数直接从属于对象obj var innerFunc = function(){//这里的函数不是特定对象的直接成员,只是另一个函数的变量而已。 alert(this); }; innerFunc(); } }; obj.func()
结果:
以此输出“obj的范围内”和“Object Window(FF下测试)”
但是我们可以人为的改变作用域,即改变this指向的对象。
如果最后一行代码换为obj.func.call(window)。
那么两次输出的结果都为“Object Window(FF下测试)”
从上面的例子可以发现,call实际是另外一个方法,属于JS的语言核心(Runtime)为obj.func提供的内建方法。
无论是哪一个函数,主要能够typeof foo == "function"是成立的,就必然有call的方法。
修改下代码:
var obj = { toString:function(){//重写toString函数。这里说明下,默认情况下,Object对象都有一个toString的方法。 return "obj的范围内"; }, func:function(){ alert(this);//这里的函数直接从属于对象obj var innerFunc = function(){//这里的函数不是特定对象的直接成员,只是另一个函数的变量而已。 alert(this); }; innerFunc.call(this); } }; obj.func()
这样,2次打印的结果都是"obj的范围内"。