请看下面的代码:
var fruit = "Orange";
echoThis();
function echoThis() {
alert(fruit);
var fruit = "Apple";
}
当我运行此代码段时,fruit
的提醒为undefined
。为什么呢?
首先我认为它与吊装有关,在一个函数中,JS引擎将所有var
声明“提升”到顶部或者其他东西,但是我希望警报显示{{1 }},而不是Apple
。
我可能没有意识到一些基本的JS行为。有人在乎解释吗?
答案 0 :(得分:6)
这是因为hoisting。函数中声明的变量可用于整个范围,但会为它们分配一个值。
这:
function echoThis() {
alert(fruit);
var fruit = "Apple";
}
成为这个:
function echoThis() {
var fruit;
alert(fruit);
fruit = "Apple";
}
这就是您成功评估代码的原因,但未定义水果的值。
还:
var fruit = "Orange"; //this fruit variable
echoThis();
function echoThis() {
alert(fruit);
var fruit = "Apple"; // is overridden by this,
//because it's re-declared in a local scope.
}
如果您确实要更改此设置,请删除该功能中的var
。
function echoThis() {
alert(fruit);
fruit = "Apple"; //this now accesses the global fruit.
}
答案 1 :(得分:3)
变量在编译时被提升到函数的顶部。
{{1}}
因此,当调用警报时,此时技术上尚未定义。 停止查看在警告声明之前移动变量声明。
答案 2 :(得分:0)
这是因为js具有词汇范围和悬挂。
所以echoThis
在向外看之前会查找fruit
内的var fruit = "Apple";
,因为fruit
已echoThis
,function echoThis() {
alert(fruit);
var fruit = "Apple";
}
Translates to this
function echoThis() {
var fruit;
alert(fruit);
fruit = "Apple";
}
已悬挂在 var proxy = textDocumentProxy as! UITextInput
proxy.insertText("hello world")
。
答案 3 :(得分:0)
除了上面的回答之外,如果你想获得橙色和苹果之后......你可以尝试将变量简单地作为参数传递并在函数中工作
var fruit = "Orange";
echoThis(fruit);
function echoThis(fruit) {
alert(fruit); // You will get the orange
var fruit = "Apple";
alert(fruit); // You will get the apple
}