javascript的變量聲明提升
這篇隨筆是對網(wǎng)上文章的整理吸收
1. javascript的作用域是函數(shù),不是塊
2. 在函數(shù)內部,javascript解釋器會把var變量提升到當前域的最前面,但是函數(shù)體不會提升。
看下面例子:
var v = "hello";
(function(){
console.log(v);
// var v = "world";
})();
輸出值為 hello
var v = "hello";
(function(){
console.log(v);
var v = "world";
})();
輸出值為undefined
why?
因為第二個函數(shù)javascript解釋器會解釋成下面這樣執(zhí)行
var v = "hello";
(function () {
var v;
console.log(v);
v = "world";
})();
變量v沒有賦值所以輸出undefind。
函數(shù)和變量的聲明會被提升,函數(shù)定義和變量定義不會被提升
看下面例子
(function(){
f1();
var f1 = function(){};
})();
**上面函數(shù)執(zhí)行會報 **
TypeError: undefined is not a function
這個很好解釋,因為函數(shù)會被javascript解釋為
(function () {
var f;
f1();
f1 = function () {
};
})();
下面這個函數(shù)可以運行,不要覺得奇怪
(function () {
f2();
function f2() {
console.log('will run !');
}
})();
因為它被解釋成下面這樣了。函數(shù)定義被提到最前面了。
(function () {
function f2() {
console.log('will run !');
}
f2();
})();
猜猜下面代碼執(zhí)行效果?
(function(){
var foo;
console.log(typeof foo); //function
function foo(){}
foo = "foo";
console.log(typeof foo); //string
})();
為什么?因為它同下面這個函數(shù)是一樣的。
(function(){
var foo;
function foo(){}
console.log(typeof foo); //function
foo = "foo";
console.log(typeof foo); //string
})();
浙公網(wǎng)安備 33010602011771號