解释变量如何“泄漏”?

时间:2015-01-23 03:47:04

标签: javascript

我正在阅读关于在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! 

我不明白这里发生了什么。我正在寻找技术解释。到目前为止如何在外面访问?

编辑:我理解这个函数是如何表现的,我应该澄清并说我想要了解代码和内存中发生的事情(例如,指针等)。

4 个答案:

答案 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未声明。 分配给未声明的变量会创建一个全局变量(隐式)。