在web中全局變量和全局方法都是window對象的一個屬性榔昔。
變量提升
js中對var定義的變量有提升的效果态罪,比如下面代碼
var a = "abcd";
在js中是這樣存在的
var a;
a = "abcd";
對于方法中的var也是一樣,不過僅限于方法內(nèi)的作用域
function test() {
console.log(a)
var a = "abcd";
console.log(a)
};
test();
//就被js解析成
function test() {
var a;
console.log(a) // undefined
a = "abcd";
console.log(a) // abcd
};
test();
若方法內(nèi)定義的var變量與全局定義var變量重名了察藐,此時適用就近原則(局部優(yōu)先)歪脏,比如
var a = "abcd";
function test() {
console.log(a); //undefined
var a = "dcba";
console.log(a);// dcba
};
test();
js定義變量有var let(這里不做討論)和 不寫變量聲明,比如:
var a = "abcd";
b = "xyz";
都可以成為一個變量,這2種方式還是有區(qū)別的技扼,var定義的是函數(shù)作用域伍玖,沒有限定符修飾的,是綁定在window上的剿吻,是全局作用域窍箍,var定義的變量是有提升作用的,而沒有限定符修飾的是沒有變量提升的(因為此時是直接賦值了丽旅,也就沒有變量提升了)椰棘。比如
function test() {
console.log(a); //報錯,a is not defined
a = "abcd";
console.log(a)
};
test();
不帶限定符修飾的是全局變量榄笙,比如
function test() {
a = "abcd";
console.log(a); //abcd
};
test();
console.log(window.a); // abcd
function test() {
var a = "abcd";
console.log(a);//abcd
};
test();
console.log(window.a); //undefined
方法提升
方法提升就比較有意思了邪狞,在js中優(yōu)先級,方法>變量>自上到下茅撞。比如:
console.log(a); // f a() {return 10;}
console.log(a()); // 10
var a = 3;
console.log(a) //3
function a() {
return 10;
}
下面這2個方法看起來沒啥區(qū)別帆卓,實質(zhì)在提升這方面還是有區(qū)別的巨朦。
a();
var a = function () {
console.log("abcd");
};
此時運行會報錯,a is not a function剑令,此時a并不是方法糊啡,而是一個變量,按照變量提升而不是方法方法提升
//~~~~~~~~~~~~~~~~~~~
a();
function a() {
console.log("abcd");//abcd
}
提升機制
- 變量提升
//xx
var getName = function() {
}
等價于
var getName;
//xx
getName = function() {
}
- 方法提升(直接把定義函數(shù)的代碼抽取到最前面)
//xx
function getName() {
}
等價于
function getName() {
}
//xx