解释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当然,在这种情况下,它将是未定义的