初学 javascript ,望各位大神不吝赐教
我知道 this 的指向一般分 4 种情况:
(1)作为构造函数调用,指向构造函数生成的对象;
(2)作为函数调用,指向去全局变量
(3)作为对象的方法调用,指向到该对象
(4)使用 call 或者 apply 方法,this 指定 call 或者 apply 方法指定的执行环境。。
但是,第二点似乎跟书中有一些区别:
this 引用的是函数据以执行的环境对象。(JavaScript 高级程序设计)
这是对 this 的描述。
JavaScript 中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里。(JavaScript 高级程序设计)
这是对函数运行的描述。
function f1(){
console.log(this);//Window
function f2(){
console.log(this);//Window
}
f2();
}
f1();
而在上述这段代码中,函数 f1() 和 f2() 的 this 都绑定到了全局变量,而照书中说法,f2() 的作用域链在定义的时候应该为:
[[scope chain]]=[ {f1的变量对象}, {window call object}]
在函数 f2 进入执行流后,会将 f2 的活动对象作为变量对象加到作用域链的最前端,此时 f2() 的作用域链为:
[[scope chain]]=[ {f2的活动对象},{f1的变量对象}, {window call object}]
那么,this 应该绑定到f1上才对,为什么还是绑定到了 window 对象呢?
闭包和匿名函数里面的this指的是window,这点有点特殊。另外,你可以尝试着这样理解,this指的就是第一个包含当前函数的对象。
this
对象是在运行时基于函数的执行环境绑定的,它可能是全局对象或者其他的某个对象,随着函数的执行环境不同,this
的值也会不一样。但是总有一个原则,那就是 this 指的是 调用函数的 那个对象。
还有另一个原则:当没有明确的调用函数的那个对象时,this
指向全局对象global
,浏览器模式下就是window
了。
By default,
this
refers to the global object.
上面的栗子不符合你列举this
使用情况的(1)(3)(4),而(2)又不确定就用默认规则试试咯~反正它俩结果一样……(这样想不够严谨),但其实它是符合你列举的规则(2)的。
作为函数调用的this指向书上描述是没有错,但语言设计上一直就有这个bug,作为内嵌定义函数,不管外层函数this是什么,它自己的this在非严格模式下都是指向全局对象,严格模式就是undefined,所以一般在外层函数把this赋值给一个变量让内层函数调用。
PS. 还有一个特例就是方法调用的函数的函数赋值给一个变量来调用的话this会变为指向全局对象,看下代码应该就懂了。
function Foo() {}
Foo.prototype.method = function() {};
function Bar() {}
Bar.prototype = new Foo();
new Bar().method();
method 调用时 this 指向的是 Bar 的实例