javascript - 本地 Javascript 范围问题

标签 javascript scope

如果我这样做:

var a = 0;

(function () {
    var a = a; //want to make local a = global a
    ++a;
    console.log("fn",a);
})();

console.log(a);​

输出是:

fn NaN
0

为什么自执行函数中的a会变成NaN

我知道这样做会很好:

(function () {
    var b = a;
    ++b;
    console.log("fn",b); // fn 1
})();

但如果我按照第一个版本的方式进行操作,它就会出现 NaN 问题。

为什么会这样?

最佳答案

var a = a;其实就是var a; a = a; 由于变量提升。这意味着在赋值时,旧的 a 已经被新的(undefined)隐藏了。

避免此类问题的最简单方法是将值作为参数传递:

(function (a) {
    ++a;
    console.log("fn",a);
})(a);

如果 a 是一个全局变量,您还可以使用 var a = window.a;,例如 woz suggested - 但由于拥有全局变量通常不是一个好主意,所以最好保留参数。

关于javascript - 本地 Javascript 范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11457299/

相关文章:

python - 考虑三个嵌套函数。最内层的函数可以访问最外层的命名空间吗?

javascript - 指定哪个区域是日期排序

javascript - 使用 jQuery 显示 2 个模态窗口

javascript - 我可以在 IE 8 中使用什么 Javascript 或 Jquery 库来绘制甘特图?

javascript - 如何在不创建 HtmlElement 的情况下从 HTML 字符串中提取 textContent?

IOS Objective-C 选择器使用了错误的范围

javascript - jQuery:ASP.NET 内容页面中预期的对象

ios - Swift 中带有任务的变量作用域

javascript - Angularjs $scope - 如何通过 Controller 获得正确的范围(初学者)

在对象中时未触发 JavaScript mousemove 事件