x = 1;
alert(x);
var y = function() {
alert(x);
var x = 2;
alert(x);
}
y();
3次æ醒的结果是:1
,undefined
,2
(Chrome 25)
我的问题是:为什么第二个è¦æŠ¥æœªå®šä¹‰ï¼Ÿä¸ºä»€ä¹ˆä¸æ˜¯1?是ä¸æ˜¯æœ‰å…¨å±€å˜é‡x?
ç”案 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â€ã€‚å› æ¤ï¼Œå½“您在函数ä¸å£°æ˜ŽæŸä¸ªå˜é‡æ—¶ï¼Œæˆ‘建议您在函数顶部声明å˜é‡ã€‚