【发布时间】:2017-05-19 22:47:47
【问题描述】:
所以我在玩回调的概念,我遇到了一种情况,我想确保我知道我认为正在发生的事情,实际上正在发生的事情。
function greet(callback) { // 'greet' function takes a callback
var greeting = "hi"; // 'greeting' variable is set in the scope
callback() // 'callback' function is invoked
}
greet(
function() {
console.log(greeting)
});
//Console logs nothing
有点奇怪,你会期望 callback() 在下一个最接近的范围内查看并找出问候语是什么。但是,一旦我向全局执行上下文声明了问候语变量,问候语就会记录在控制台中。
var greeting = 'hi' // 'greeting' variable is set in global context
function greet(callback) { // 'greet' function takes a callback
callback() // 'callback' function is invoked
}
greet(
function() {
console.log(greeting)
});
//Console logs: 'hi'
这是因为从技术上讲,记录变量的 callback() 函数实际上是在全局上下文中定义的,并且只是在 greet() 内部调用吗?所以它不会像普通函数表达式那样首先查看 greet() 的内部,而是直接查看全局上下文,因为这是定义它的地方。
我只是想确保我了解这里发生的事情,而不是我没有意识到的一些奇怪的范围/块问题。
【问题讨论】:
-
“你会期望 callback() 在它的下一个最接近的范围内查找并找出问候语是什么。” JavaScript 有 lexical 范围,而不是 动态 范围。大多数语言都有词汇范围。回调未在
greet的范围内定义,因此无权访问该范围。
标签: javascript