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