我正在阅读关于在mozilla中提升的内容,并注意到一个示例解释了变量如何在函数范围之外泄漏: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var#Initialization_of_several_variables
例子说,
var x = 0;
function f(){
var x = y = 1; // x is declared locally. y is not!
}
f();
console.log(x, y); // 0, 1
// x is the global one as expected
// y leaked outside of the function, though!
我不明白这里发生了什么。我正在寻找技术解释。到目前为止如何在外面访问?
编辑:我理解这个函数是如何表现的,我应该澄清并说我想要了解代码和内存中发生的事情(例如,指针等)。
答案 0 :(得分:2)
var x = 0;
function f(){
var y = 1;
var x = 1;
}
f();
console.log(x, y);
试试上面的代码。问题是你没有在y前面包含var。结果是y被提升到全球范围。
答案 1 :(得分:2)
你有var x = y = 1
这意味着x在里面声明但是y不是,var
在这种情况下不适用于y,这就是为什么它是泄露在功能之外
答案 2 :(得分:0)
在JavaScript中,变量会在您使用时立即声明,如下所示:
function f(){
y = 1;
}
问题是y在f()中不是scoped
,就像在大多数其他编程语言中一样。所以你可以这样做:
function f(){
y = 1;
}
console.log(y);
您将在控制台上看到1
。
这通常被认为是一种不好的做法,因为它污染了你的命名空间,并且可能导致微妙的,难以追踪的错误。
为避免这种情况,请始终使用var
显式声明变量,如下所示:
function f(){
var y = 1;
}
// the y declared in f() is not accessible out here
console.log(y)
这应该会给你一个错误,例如:“未定义的ReferenceError:y未定义”在你的控制台上。
有关详细信息,请阅读此页,特别是“自动全局”部分:http://www.w3schools.com/js/js_scope.asp
在上面给出的示例中,问题更加微妙,因为x的范围正确,但y的简写声明使其全局范围:
function f(){
var x = y = 1;
}
答案 3 :(得分:0)
这是声明的细分:
var x = y = 1;
\___/ \____/
identifier initializer
\____________/
variable declaration
在这种情况下,初始化程序是另一个赋值。由于可变吊装,本声明的评估如下:
var x;
x = y = 1;
如您所见,y
未声明。 将分配给未声明的变量会创建一个全局变量(隐式)。