知识卡片

this绑定由调用方式决定而非定义位置

专业/工作 · 412

内容

this的值不是在函数定义时确定的,而是每次调用时由调用方式动态决定的:以o.m()形式调用,this就是o;以裸函数f()形式调用,this在非严格模式下是全局对象、严格模式下是undefined;通过call/apply调用,this由调用者显式指定。这带来一个常见陷阱:this不遵循词法作用域规则,嵌套函数不会自动继承外层函数的this——哪怕外层函数是作为方法被调用、this明明指向某个对象,内部嵌套函数单独被调用时this依然会跌回全局对象或undefined。这正是”var self=this”这种写法反复出现的原因:开发者把外层的this显式存进一个普通变量,让内层函数通过闭包(而非this机制本身)去访问它,绕开了this不随词法作用域传递的限制。

参考来源

《JavaScript权威指南(原书第6版)》第8章《函数》