变量查找依赖作用域链而非原型链;全局上下文中声明的变量通过作用域链逐级搜索,不走__proto__;原型链仅用于对象属性访问(如obj.x),与裸变量访问无关。

全局执行上下文中的变量查找,不走原型链。
变量查找靠作用域链,不是原型链
JavaScript 中变量(如 var、let、const 声明的标识符)的查找机制依赖于作用域链,而非原型链。原型链只负责对象属性和方法的访问,比如 obj.name 或 arr.push() 这类操作。
- 全局执行上下文中声明的变量(例如
var a = 1),会作为全局对象(浏览器中是window,Node.js 中是global)的属性存在 - 但变量名本身不是通过
__proto__向上查找的;它直接在当前及外层作用域链中逐级搜索 - 即使你把变量挂在
window上,访问它仍是作用域行为,不是“顺着window.__proto__找”
原型链只在对象属性访问时触发
只有当你明确以点号或方括号访问一个对象的属性时,JS 引擎才会启动原型链查找:
-
obj.x→ 先查obj自身,再查obj.__proto__,再查obj.__proto__.__proto__… -
window.x看似类似,但本质是:如果x是全局变量,它已作为window.x存在,访问它属于属性读取,此时才走原型链(不过通常window自身就有该属性,不会上溯) - 但
console.log(x)这种裸变量访问,完全由作用域链决定,与__proto__无关
容易混淆的典型场景
以下情况常被误认为“变量查找用了原型链”,实际逻辑不同:
-
function f() { console.log(a); }中的a:查找发生在作用域链(全局 → 函数),不是原型链 -
window.toString():这是对象属性访问,window自身没有toString,于是沿window.__proto__(即Window.prototype)→Window.prototype.__proto__(即Object.prototype)找到方法——这才是原型链生效 -
var x = 1; console.log(x);:纯作用域查找,不涉及任何__proto__
总结一句话
执行上下文管变量,原型链管属性;全局上下文里的变量名解析,全程在作用域链里完成,原型链不参与也不延伸。











