默认绑定只影响this值,不改变作用域查找逻辑;变量始终按函数定义时的词法作用域链查找,与调用方式无关。

默认绑定在函数嵌套调用中,**不改变作用域查找逻辑,只决定 this 的值**;作用域查找本身始终遵循词法作用域链,与 this 绑定无关。
默认绑定只影响 this,不影响变量查找
默认绑定发生在函数以“独立方式”被调用时(比如 foo()),此时 this 被绑定为全局对象(非严格模式)或 undefined(严格模式)。但这个过程完全独立于变量的查找机制——变量是否能找到、从哪一层找到,取决于函数定义时的词法嵌套结构,而不是调用方式。
例如:
const x = "global";
function outer() {
const x = "outer";
function inner() {
console.log(x); // 输出 "outer",不是 "global"
}
inner(); // 这里 inner 是作为普通函数调用(默认绑定),this 可能是 window 或 undefined
}
outer();
尽管 inner() 触发了默认绑定,它的变量 x 依然沿作用域链向上查到 outer 作用域,而非跳过或受 this 影响。
嵌套调用中默认绑定常出现在隐式丢失场景
当嵌套函数被“间接调用”(如赋值后调用、作为回调传入),原方法的隐式绑定失效,退回到默认绑定。此时 this 改变,但作用域链不变。
-
隐式绑定存在时:
obj.method()→this指向obj,变量仍按定义位置查找 -
隐式丢失后:
const fn = obj.method; fn()→this变为默认值,但fn内部所有变量引用仍走原有词法作用域链
也就是说:函数在哪里定义,就固定了它的作用域链;它怎么被调用,只决定 this 绑定结果。
作用域链查找始终从当前执行上下文开始
无论嵌套多深、调用方式如何,变量查找都严格按以下顺序进行:
- 先在当前函数自己的词法环境(局部变量)中找
- 没找到,就到外层函数定义时所在的作用域中找(不是调用时所在作用域)
- 逐层向外,直到全局作用域
这个链在函数创建时就已确定,运行时不因调用栈或 this 变化而重排。即使嵌套调用中某层触发默认绑定,也不会打断或重定向这条链。
注意:不要混淆 this 和作用域链
初学者容易误以为 “this 指向哪里,变量就从哪里找”。这是错误的:
-
this是运行时绑定的执行上下文对象,用于访问方法调用者属性 - 作用域链是静态确定的词法嵌套关系,用于解析标识符(如变量名、函数名)
- 二者机制不同、目标不同、时机不同,不能互相替代或推导
比如 setTimeout(obj.method, 100) 中,method 内部的 this 是默认绑定(undefined),但它访问的自由变量仍来自其定义时的外层作用域,不受 setTimeout 所在环境影响。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











