Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解释JavaScript中的变量作用域_Javascript_Scope - Fatal编程技术网

解释JavaScript中的变量作用域

解释JavaScript中的变量作用域,javascript,scope,Javascript,Scope,这很简单,但我不明白为什么它不起作用 var a=function(){ console.log(c);/“10”应为,但未定义 }; var b=函数(){ var c=10;//局部变量,但我认为它对于b()是可访问的 a(); }();这样: var c = 0; var a = function() { console.log(c); // "10" is expecting, but it is not defined }; var b = function() {

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

var a=function(){
console.log(c);/“10”应为,但未定义
};
var b=函数(){
var c=10;//局部变量,但我认为它对于b()是可访问的
a();
}();这样:

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 = 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();
}();

您忘了向函数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);
}();

您忘了向函数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);
}();

从另一个角度来看这个问题更好。为什么要定义它
a
不会真的如此可重用,因为它的注释是“注意:只有在包含函数中声明了
var c
时,才能运行此函数”。这只是不太容易发现,这意味着很难跟踪特定命名范围的使用时间

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
不会真的如此可重用,因为它的注释是“注意:只有在包含函数中声明了
var c
时,才能运行此函数”。这只是不太容易发现,这意味着很难跟踪特定命名范围的使用时间

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
。您可以定义
var c=0
a
之外,或将
c
作为
a
的参数传递给
a
函数有一个新范围,其中未定义
c
。您可以定义
var c=0
a
之外,或将
c
作为参数传递给
a

函数继承声明它的父作用域,而不是调用它的父作用域。所有函数都继承窗口作用域,所以您可以将变量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();
}();

函数继承声明它的父作用域,而不是调用它的父作用域。所有函数都继承窗口作用域,所以您可以将变量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();
}();

c
b
是本地的,对
a
不可见
c
需要存在于
b
之外,或者您需要将其传递给
a
。因为c位于b中,并且不能从b之外访问它,所以您可以将c作为参数var a=函数(c){console.log(c);//“10”传递,但未定义};var b=function(){var c=10;//局部变量,但对于b(),它是可访问的,我认为a(c);}()
c
b
本地的,它对
a
不可见
c
需要存在于
b
之外,或者您需要将其传递给
a
。因为c位于b中,并且不能从b之外访问它,所以您可以将c作为参数var a=函数(c){console.log(c);//“10”传递,但未定义};var b=function(){var c=10;//局部变量,但对于b(),它是可访问的,我认为a(c);}();你也忘了这是行不通的。您没有将c传递给a();它将返回UnfinedEyers lol我也错过了:)实际上我错过了问题的要点:)也可以在
a
使用
console.log(参数)
,而不声明可能的参数
c
您也忘了它。:)这是行不通的。您没有将c传递给a();它将返回UndefinedEyers lol我也错过了:)事实上我错过了问题的要点:)也可以使用
console.log(arguments)
a
,而不声明可能的参数
c
@rahuldesa我确定,在这种情况下它将是undefined@RahulDesai当然,在这种情况下,它将是未定义的