解释JavaScript中的变量作用域

Explaining variable scope in JavaScript

本文关键字:变量 作用域 JavaScript 解释      更新时间:2023-09-26

这很简单,但我不明白为什么它不起作用。

var a = function() {
	console.log(c); // "10" is expecting, but it is not defined
};
var b = function() {
	var c = 10; // local variable, but it is accessibly for b(), I think
	a();
}();

为什么没有定义变量c?如果不将c作为参数传递给b(),我该如何解决这个问题?

这种方式:

var c = 0;
var a = function() {
    console.log(c); // "10" is expecting, but it is not defined
};
var b = function() {
    c = 10; // local variable, but it is accessibly for b(), I think
    a();
}();

这个问题最好从另一边看。为什么要定义?如果有一条注释说"注意:只有在包含函数中声明了var c,才能运行此函数",那么a就不那么可重用了。这不是很容易发现的,这意味着很难跟踪某个命名范围的使用时间。

JavaScript的一个功能是"闭包"。这是指在另一个函数内部声明整个函数;当您觉得第二个函数不应该有自己的命名和在代码结构中的位置时,它对于回调非常方便。

这里将发生的情况是,该语言将自动看到它在您声明的函数内部需要c(已声明),因此它保留了对它的内部引用,与callbackFunction变量相关。所以,你仍然可以在那里参考它。

var b = function() {
    var c = 10; // local variable, but it is accessibly for b(), I think
        var callbackFunction = function() {
           console.log(c);
        };
        // optionally, place c in a setTimeout, ajax callback, etc.
    callbackFunction();
}();

函数a有一个未定义c的新作用域。您可以在a之外定义var c = 0;,或者将c作为参数传递给a

您忘记添加参数来实现

var a = function(c) {
    console.log(c); // "10" is expecting, but it is not defined
};
var b = function() {
    var c = 10; // local variable, but it is accessibly for b(), I think
    a(c);
}();

函数继承的是声明它的父作用域,而不是调用它的父范围。所有函数都继承了窗口范围,所以您可以将变量c设为全局变量。

var a = function() {
    console.log(c); // "10" is expecting, but it is not defined
};
var b = function() {
    c = 10; // local variable, but it is accessibly for b(), I think
    a();
}();