var a=100;
function a(){
console.log(a);
}
a();// a is not a function
原來
- 函數聲明會置頂
- 變量聲明也會置頂
- 函數聲明比變量聲明更置頂
- 變量和復制語句一起書寫,在js引擎解析時,會將其拆成聲明和賦值兩個部分,聲明置頂,賦值保留在原來的位置
- 聲明或的變量不會重復聲明
實際上這段代碼等同於
var a; //函數聲明
var a; //變量聲明(實際上這里不會重復聲明了)
a = function(){ console.log(a); }; //函數賦值
a = 100;//變量賦值(給a重新賦值了)
a()//a is not a function
而如果代碼會如下寫法則a方法會執行
var a; //函數聲明
var a; //變量聲明(實際上這里不會重復聲明了)
a = 100;
a=function(){console.log(123)}//函數賦值
a()//123
一道有意思的題目
function Foo() {
getName = function () { alert (1); }; //運行這個函數重新賦值了 getName
return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}
//請寫出以下輸出結果:
Foo.getName(); // 3
getName(); // 4
Foo().getName(); // 1
getName(); // 1
new Foo.getName(); // 2
new Foo().getName(); // 3
new new Foo().getName(); // 3
