如果我这样做:
var a = 0;
(function () {
var a = a; //want to make local a = global a
++a;
console.log("fn",a);
})();
console.log(a);?
Run Code Online (Sandbox Code Playgroud)
输出是:
fn NaN
0
Run Code Online (Sandbox Code Playgroud)
为什么a自执行功能内部变成了NaN?
我知道如果我做的话它可以正常工作:
(function () {
var b = a;
++b;
console.log("fn",b); // fn 1
})();
Run Code Online (Sandbox Code Playgroud)
但是,如果我采用第一个版本的方式,那就有NaN问题了.
为什么会这样?
Thi*_*ter 12
var a = a;实际上是var a; a = a;由于可变吊装.这意味着在分配时旧a的已经被新的阴影(即undefined).
避免这类问题的最简单方法是将值作为参数传递:
(function (a) {
++a;
console.log("fn",a);
})(a);
Run Code Online (Sandbox Code Playgroud)
如果a是一个全局变量,你也可以使用var a = window.a;像woz建议的那样 - 但是因为拥有全局变量通常是一个坏主意更好地保持参数.
在a你的函数表达式中变量阴影中a的外部声明变量.
它变成了NaN,因为在任务中:
var a = a;
Run Code Online (Sandbox Code Playgroud)
右边a它实际上指的a是在本地范围内.
变量声明在函数实际开始执行之前完成,这通常称为"提升".
由于它是相同的变量,它保存undefined值,当您尝试向此值添加任何数字时,它变为NaN:
console.log(undefined + 0);
Run Code Online (Sandbox Code Playgroud)