我有以下代码:
function log(a) {
var b = 5;
a();
}
log(function(){
console.log(b);
});
当在函数日志中执行该匿名函数时,我收到“b 未定义”。好吧,看来 anon 的外部环境引用不是日志的,因为如果它不是在其中创建的,那么它就找不到那个 var。那么它是在哪里创建的呢?在全局层面?我最初的想法是这些括号使匿名函数在日志内部创建。
最佳答案
每次调用函数时,假设您没有声明全局变量(您没有声明任何变量),则会为该函数创建作用域,并且该作用域中的内容并不由该函数所在的位置决定称为,但由它定义的位置决定。您可以看到,在定义匿名函数的位置(在调用 log 中),变量 b
不在该范围内,这就是它不可用的原因。
让我们重写您的代码:
function log(a) {
var b = 5;
a();
}
function logger() {
console.log(b);
}
log(logger);
你可以看到你的代码和我的代码在做同样的事情,唯一的区别是我的代码没有 anon 函数。它们在各自的作用域内不共享公共(public)变量。
现在看看这个:
var b = 5;
function log(a) {
a();
}
function logger() {
console.log(b);
}
log(logger);
现在 log 和 logger 在它们的作用域中共享一个公共(public)变量 b (log 不使用 b,所以如果您在调试器中检查它,它将是未定义的)。正如我所说,您不是通过调用函数的位置来确定作用域,而是通过声明函数的位置和方式来确定作用域。
关于Javascript - 函数的外部引用显示 "not defined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33467173/