JavaScript var 关键字:在闭包中重新定义变量的值



这里缺少什么?这与预期的一样:

var x = 1;
(function(){
// x === 1
})();

但是,

var x = 1;
(function(){
var x = x;
// x is undefined
})();

我认为x应该是1。似乎var x = x在分配x值之前会对其进行核处理。这是个虫子吗?这似乎不是很直观。

这种行为改变了吗?我记得以前做过这样的事。

供参考:

var x = 1;
(function(){
var y = x;
// y === 1
})();

和:

var x = 1;
(function(){
x = x;
// x === 1
})();
var x = 1;
(function(){
var x = x;
})();

可变吊装后变为:

var x = 1;
(function(){
var x;
x = x;
})();

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/var

因为变量声明(以及通常的声明)是在执行任何代码之前处理的,所以在代码中的任何位置声明变量都相当于在顶部声明变量。这也意味着一个变量在声明之前就可以被使用。这种行为被称为"提升",因为变量声明似乎被移动到了函数或全局代码的顶部。

这就是为什么有时在插件中你会看到类似的代码

var i,j,abc, d;
//code

在您的示例中,代码转换如下:

function() {
var x;
x = x;
}

带有函数参数的示例不同,您只需更改函数参数本身,就会忽略var声明。

如果一个作用域变量是用let声明的,它只会移动到该作用域的开头,而不会移动到函数的开头,因此此代码有效:

var x = 1;
(function(){
var y = x;
{
let x = y;
console.log(x);
}
})();

正如所指出的,这是一个新功能,因此并非所有地方都支持它。

最后,在这里:

var x = 1;
(function(){
x = x;
// x === 1
})();

您没有在本地声明x,所以如果您编辑它,它也会在全局范围内编辑它。

在JavaScript中,所有变量都在全局作用域或其声明的整个函数的作用域中声明。例如:

var x = 1;
function f()
{
console.log(x);
if (true) {
var x;
}
}
f();

这是一种奇怪的编程语言设计,但由于这个规则,这段代码也会打印"未定义"。

每次键入var都会重新分配一个新变量。当您在函数中引用x时,它会查找上面的赋值语句。

function f(){
var x = x;  //this tries to reassign var x to undefined.
}

这里要做的是将x设置为全局变量,然后将其设置为引用自身,覆盖1,使x=>x未定义。

最新更新