javascript this 指向问题

初学javascript,望各位大神不吝赐教
我知道this的指向一般分4种情况:
(1)作为构造函数调用,指向构造函数生成的对象;
(2)作为函数调用,指向去全局变量
(3)作为对象的方法调用,指向到该对象
(4)使用call或者apply方法,this指定call或者apply方法指定的执行环境。。
但是,第二点似乎跟书中有一些区别:
this引用的是函数据以执行的环境对象。(JavaScript高级程序设计)
这是对this的描述。
JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里。(JavaScript高级程序设计)
这是对函数运行的描述。
functionf1(){
console.log(this);//Window
functionf2(){
console.log(this);//Window
}
f2();
}
f1();
而在上述这段代码中,函数f1()和f2()的this都绑定到了全局变量,而照书中说法,f2()的作用域链在定义的时候应该为:
[[scopechain]]=[{f1的变量对象},{windowcallobject}]
在函数f2进入执行流后,会将f2的活动对象作为变量对象加到作用域链的最前端,此时f2()的作用域链为:
[[scopechain]]=[{f2的活动对象},{f1的变量对象},{windowcallobject}]
那么,this应该绑定到f1上才对,为什么还是绑定到了window对象呢?
撒科打诨
浏览 325回答 2
2回答

aluckdog

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

神不在的星期二

作为函数调用的this指向书上描述是没有错,但语言设计上一直就有这个bug,作为内嵌定义函数,不管外层函数this是什么,它自己的this在非严格模式下都是指向全局对象,严格模式就是undefined,所以一般在外层函数把this赋值给一个变量让内层函数调用。PS.还有一个特例就是方法调用的函数的函数赋值给一个变量来调用的话this会变为指向全局对象,看下代码应该就懂了。functionFoo(){}Foo.prototype.method=function(){};functionBar(){}Bar.prototype=newFoo();newBar().method();method调用时this指向的是Bar的实例
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript