本地Javascript范围问题

Nea*_*eal 8 javascript scope

如果我这样做:

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建议的那样 - 但是因为拥有全局变量通常是一个坏主意更好地保持参数.


CMS*_*CMS 6

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)