解释JavaScript中的变量作用域
Explaining variable scope in JavaScript
这很简单,但我不明白为什么它不起作用。
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();
}();
相关文章:
- 带有KendoUI组件的Javascript变量作用域
- Javascript变量作用域:从回调函数中提取变量
- 使用JavaScript回调函数了解变量作用域和闭包
- jquery.post和变量作用域
- 变量作用域:在函数之间传递的名称
- 在 AJAX 和 Javascript 中使用变量和变量作用域
- 节点.js/express.js中的变量作用域
- jquery ajax 回调变量作用域(为什么有些在作用域中,而另一些则不在作用域中)
- JavaScript 中的变量作用域
- ajax GET 和 POST 中的变量作用域
- Javascript:变量作用域和全局变量的弊端
- Javascript 自执行函数和变量作用域
- 拼接上的Javascript全局变量作用域/覆盖
- 在Node中与jsdom和jquery共享变量作用域
- NodeJS:代码优化和变量作用域
- Javascript数组变量作用域
- AngularJS ng控制器指令不接受javascript中的变量(作用域函数),也不给出任何错误
- 回调函数中的变量作用域呢
- JavaScript/jQuery变量作用域导致错误
- AJAX变量作用域