我有以下代码:
function log(a) {
var b = 5;
a();
}
log(function(){
console.log(b);
});
当在功能日志中执行该功能时,我得到“b未定义”。好吧,看起来anon的外部环境引用不是log的,因为如果它不是在它内部创建的,那么它就找不到var。那它在哪里创建?在全球范围内?我最初的想法是那些括号使得在log的内部创建了anon函数。
答案 0 :(得分:1)
每次调用一个函数时,假设你没有声明全局变量(你没有声明任何变量),就会为该函数创建范围,并且该范围内的内容不是由函数叫,但是定义。您可以看到您定义匿名函数的位置(在调用日志中),变量b
不在该范围内,这就是它不可用的原因。
让我们重写您的代码:
function log(a) {
var b = 5;
a();
}
function logger() {
console.log(b);
}
log(logger);
你可以看到你的代码和我的代码做了同样的事情,唯一的区别是我的代码没有anon函数。它们不在其范围内共享共同变量。
现在看看这个:
var b = 5;
function log(a) {
a();
}
function logger() {
console.log(b);
}
log(logger);
现在log和logger在它们的作用域中共享一个公共变量b(log不使用b所以如果你在调试器中检查它将是未定义的)。正如我所说,你不是通过调用函数的位置确定范围,而是根据声明的位置和方式确定范围。
答案 1 :(得分:0)
在JavaScript范围内存在函数。所以你的b变量只在其范围内可见 - 匿名函数。如果您希望它在函数外部可见,那么您可以将变量分配给全局范围。
function log(a) {
window.b = 5;
a();
}
log(function(){
console.log(b);
});