为什么定义在函数内部的x在我没有声明它为变量的情况下变成了一个全局变量?

Why does x, defined inside a function, become a global variable when I didn't declare it to be a variable in the first place?

本文关键字:全局变量 一个 情况下 内部 函数 定义 为什么 声明 变量      更新时间:2023-09-26

提前感谢你的帮助!

var f2 = function() {
  x = "inside f2";
};
f2();
console.log(x);
// → inside f2

为什么我得到x作为一个全局变量与值"内部f2"当我没有声明它是一个全局变量与"var x;"定义函数之前?

var f2 = function() {
  var x = "inside f2";
};
f2();
console.log(x);
// → Uncaught ReferenceError: x is not defined 

我是否正确地假设x在这种情况下没有定义,因为没有全局变量x,只有函数f2中的局部变量x ?

为什么我得到x作为一个全局变量与值"内部f2"当我没有声明它是一个全局变量与"var x;"定义函数之前?

因为规范是这么说的。如果给一个未声明的变量赋值,就会创建一个全局变量。在严格模式下,这将抛出一个错误(这是更合理的)。

我是否正确地假设x在这种情况下没有定义,因为没有全局变量x,只有函数f2中的局部变量x ?

是的。


8.7.2 PutValue (V, W)
[…]
3.如果isunresolablereference (V),则
,,。如果IsStrictReference(V)为真,则
,,,我。抛出ReferenceError异常。
,, b。调用全局对象的[[Put]]内部方法,传递GetReferencedName(V)作为属性名,传递W作为值,传递false作为Throw标志。

声明的变量(使用var子句)在声明它们的执行上下文中受到约束。未声明的变量总是全局的。
裁判:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var

执行x = "inside f2"将爬上作用域链,直到它遇到x或直到全局空间,在那里它将对全局对象进行属性赋值。

无论是否在全局空间中声明 x

变量的声明既可以使用也可以不使用var关键字。主要区别在于,使用var关键字时,变量被包含在声明它的闭包中——没有该变量就被认为是全局的。

它变成全局的原因是运行时查找闭包层次结构来查找给定的变量。当它没有找到它时,它会在全局作用域中声明它,以便您使用它。

当您执行x="inside f2"时,您确实声明了一个变量。因为在该函数的作用域中没有x,编译器在当前作用域中寻找这个变量。它不存在,所以它被设置为全局。

Doing var x在当前作用域中声明变量,不一定是全局作用域。

您应该使用use strict;来捕获这样的错误