<script type="text/javascript">
function sayAlice() {
var sayAlert = function() { console.log(alice); }
var alice = 'Hello Alice';
return sayAlert;
}
sayAlice()();
</script>
在控制台中,它会显示Hello Alice
问题:
var alice
(变量声明)在var sayAlert
之后,为什么它仍然显示正确的结果,而不是'undefined'?
答案 0 :(得分:2)
因为当sayAlert
实际执行时(在sayAlice()()
来电中),Hello Alice
已分配给alice
。由于JavaScript中的闭包,alice
在执行时可用sayAlert
。
答案 1 :(得分:2)
这是JavaScript范围和提升机制。 看看this。由于提升,javascript会像这样解释您的脚本:
<script type="text/javascript">
function sayAlice() {
var alice;
var sayAlert = function() { console.log(alice); }
alice = 'Hello Alice';
return sayAlert;
}
sayAlice()();
</script>
在var alice;
声明之前var sayAlert = function() { console.log(alice); }
悬挂。
答案 2 :(得分:1)
因为saysAlert
是一个功能而且
它仅在您返回saysAlert
的{{1}}并且在您声明function
之后才会实现。
这个会给你一个未定义的变量:
alice
您的原始代码:
<script type="text/javascript">
function sayAlice() {
var sayAlert='';
console.log(alice); // alice is undefine up to this line
var alice = 'Hello Alice';
return sayAlert;
}
sayAlice()();
</script>
答案 3 :(得分:1)
<script type="text/javascript">
1: function sayAlice() {
2: var sayAlert = function() { console.log(alice); }
3: var alice = 'Hello Alice';
4: return sayAlert;
5: }
6: sayAlice()();
</script>
第2行定义了一个函数sayAlert
,但没有调用/执行它。如果您在结束括号(()
)之后放置}
,则日志将打印undefined
,因为正如您所提到的,直到之后才定义alice
。
第4行只返回sayAlert
函数,但还没有调用它(注意它仍然没有()
)
第6行接收先前从sayAlice()
调用返回的函数,并添加()
以调用返回的函数( sayAlert )。因此,在第6行运行sayAlice
后,它实际上看起来像sayAlert()
,当它执行时console.log(...)
被调用。 alice
仍然暴露在范围内,因为它尚未被垃圾收集器(类似地关闭)破坏。