这不行,因为当 "log "被创建时,"message "并不存在。
function x() {
function log() {
console.log(message)
}
const message = "hello"
log()
}
x()
setTimeout没有意识到消息的存在,在我看来,应该抛出一个错误。但似乎 "日志 "是在 "x "函数执行完毕后创建的?这怎么解释?
function x() {
setTimeout(() => {
console.log(message)
}, 500)
const message = "hello"
}
x()
我想你误解了第一段代码的作用。
你定义了一个函数 x
其中定义了一个函数 log
内,然后设定一个恒定的 message
到 "hello"。
在该片段中,没有任何一点能使 log
函数被调用,所以 console.log(message);
永远不会被调用。
在第二个代码段中,您使用的是 setTimeout
来调用一个将在500ms后运行的函数。
在第一个例子中,你没有调用 log()
函数的工作,因为它在给定时间后执行回调。setTimeout
函数工作的原因是它在给定时间后执行回调。
function x() {
function log() {
console.log(message)
}
const message = "hello"
log();
}
x()
这是因为事件循环的原因,而且事实上 setTimeout
以一个回调函数作为参数。
基本上操作的顺序如下
第一个代码片段没有记录到控制台,因为你没有调用函数x中定义的函数。你可以在第一个代码片段中通过访问变量,将变量记录到控制台。closure
.
这应该与第一个代码片段一起工作。
function x() {
const message = "hello"
return function() {
console.log(message)
}
}
x()()
另一个更简单的方法是在函数中调用函数。
function x() {
function log() {
console.log(message)
}
const message = "hello"
log()
}
x()