Javascript - 函数的外部引用显示 "not defined"

标签 javascript scope undefined

我有以下代码:

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/

相关文章:

javascript - 在 Angular 中使用变量作为 firebase 引用

c - 如何在 if 语句中初始化一个变量并在 if 语句之外使用它

r - 如何获取内部函数以在 R 控制台中测试它们

javascript - 在循环变量中重用具有给定名称的 VAR?

macos - Qt5.1/Qt5.2 + Mac OS 10.9 (Mavericks) + XCode 5.0.2,架构 x86_64 的 undefined symbol

javascript - 使用外部按钮的 webkitEnterFullscreen() 适用于 Chrome 和 Safari,但不适用于 iOS

javascript - Javascript ES6 promise 支持 'done' api 吗?

javascript - 如何使用 JavaScript 替换 html 元素?

jquery - .attr ('class' ) 在 jQuery() 上未定义

php - $_FILES 上传时为空