函数中未定义的变量

时间:2016-02-26 20:47:24

标签: javascript

请看下面的代码:

var fruit = "Orange";
echoThis();

function echoThis() {    
    alert(fruit);
    var fruit = "Apple";
}

当我运行此代码段时,fruit的提醒为undefined。为什么呢?

首先我认为它与吊装有关,在一个函数中,JS引擎将所有var声明“提升”到顶部或者其他东西,但是我希望警报显示{{1 }},而不是Apple

我可能没有意识到一些基本的JS行为。有人在乎解释吗?

JS小提琴:https://jsfiddle.net/z37230c9/

4 个答案:

答案 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";,因为fruitechoThisfunction 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
}