You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么如下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 04:06:01