Javascript - 函数的外部引用显示“未定义”

时间:2015-11-01 21:02:45

标签: javascript scope undefined

我有以下代码:

function log(a) {
    var b = 5;
    a();

}

log(function(){
    console.log(b);
});

当在功能日志中执行该功能时,我得到“b未定义”。好吧,看起来anon的外部环境引用不是log的,因为如果它不是在它内部创建的,那么它就找不到var。那它在哪里创建?在全球范围内?我最初的想法是那些括号使得在log的内部创建了anon函数。

2 个答案:

答案 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);
});