为什么我的全局å˜é‡åœ¨æœ¬åœ°å£°æ˜Žä¹‹å‰è¢«é®è”½äº†ï¼Ÿ

时间:2013-04-02 13:20:45

标签: javascript variables global-variables

x = 1; 
alert(x); 
var y = function() { 
    alert(x); 
    var x = 2; 
    alert(x); 
} 
y(); 

3次æ醒的结果是:1,undefined,2(Chrome 25)

我的问题是:为什么第二个警报未定义?为什么ä¸æ˜¯1?是ä¸æ˜¯æœ‰å…¨å±€å˜é‡x?

3 个答案:

答案 0 :(得分:13)

由于hoisting,这就是执行的内容:

x = 1; 
alert(x); 
var y = function() { 
    var x; // <-- this gets hoisted up from where it was.

    alert(x); 
    x = 2; 
    alert(x); 
} 
y();

在函数y()的开头,声明了局部å˜é‡x但未åˆå§‹åŒ–。

答案 1 :(得分:1)

函数中的å˜é‡å£°æ˜Žè¢«æå‡åˆ°é¡¶éƒ¨ã€‚所以它在技术上看起æ¥åƒè¿™æ ·ï¼š

var y = function() {
    var x;

    alert(x);

    x = 2;
};

局部å˜é‡æŽ©ç›–了全局å˜é‡ã€‚这就是警报返回undefined的原因。

答案 2 :(得分:0)

因为JavaScript中的范围是一个函数对象。当您在函数(代ç ç¤ºä¾‹ï¼‰ä¸­æ‰§è¡ŒæŸäº›ä»£ç æ—¶ï¼Œâ€œalert(x)â€å°†æŸ¥æ‰¾å‡½æ•°ä¸­æ˜¯å¦å­˜åœ¨â€œxâ€çš„任何定义。所以,这个函数中有一个“var x = 2â€ã€‚但是JavaScriptè¿è¡Œæ—¶ä¼šè§£é‡Šä½ çš„代ç ï¼š

x = 1; 
alert(x); 
var y = function() { 
  var x;
  alert(x); 
  x = 2; 
  alert(x); 
} 
y(); 

因此,第二个警报中的x是“未定义â€è€Œä¸æ˜¯â€œ1â€ã€‚因此,当您在函数中声明æŸä¸ªå˜é‡æ—¶ï¼Œæˆ‘建议您在函数顶部声明å˜é‡ã€‚