为什么如下JavaScript代码的this.length输出结果不符合预期
JavaScript this指向问题解析
我们逐行分析代码的执行逻辑,解答两个输出的来源:
第一个输出10的原因
当obj.thisFunc(func, 3)执行时,首先在thisFunc内部执行func(),这属于独立函数直接调用,非严格模式下this默认绑定到全局对象(浏览器环境为window,Node.js环境为globalThis)。你在全局作用域定义的length = 10实际就是给全局对象添加了length属性,所以this.length取到全局的10,输出10。
第二个输出2的核心原因
接下来执行arguments[0](),这里需要明确两个规则:
arguments是函数内部的类数组对象,存储了当前函数调用传入的所有实参,arguments[0]就是你传入的func函数- 当函数以
对象[属性名]()的形式调用时,属于this的隐式绑定规则,this会绑定到调用时函数前面的宿主对象上
这里func是作为arguments对象的属性被调用,所以this指向当前thisFunc的arguments对象。你调用obj.thisFunc时一共传了2个参数(func和3),所以arguments.length的值是2,因此this.length输出2。
你遗漏的this指向知识点
- 隐式绑定的核心判断标准是调用时的前缀对象:只要调用时函数前面有明确的宿主对象(无论是普通对象、数组、还是
arguments这种类数组对象),this就会绑定到这个宿主对象上,和函数定义的位置、外层函数的this没有直接关系 - 你预期输出5,是误以为
func调用时this会绑定到obj,但func从来没有作为obj的属性被调用,thisFunc的this指向obj不代表内部执行的函数this也会继承obj,除非你用箭头函数、call/apply/bind手动绑定this - 你预期输出10,是忽略了
arguments[0]()属于带前缀的属性调用,不是独立函数调用,不会触发默认绑定到全局的规则
内容的提问来源于stack exchange,提问作者kellymandem
相关产品推荐
相关产品推荐

