初学 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
对象是在运行时基于函数的执行环境绑定的,它可能是全局对象或者其他的某个对象,随着函数的执行环境不同,this
的值也会不一样。但是总有一个原则,那就是 this 指的是 调用函数的 那个对象。还有另一个原则:当没有明确的调用函数的那个对象时,
this
指向全局对象global
,浏览器模式下就是window
了。上面的栗子不符合你列举
this
使用情况的(1)(3)(4),而(2)又不确定就用默认规则试试咯~反正它俩结果一样……(这样想不够严谨),但其实它是符合你列举的规则(2)的。