这里缺少什么?这与预期的一样:
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未定义。