一、提早聲明:聲明變量後,js會把聲明部分提早到做用域前面。html
var a=1; function aheadOfStatement(){ alert(a); var a=2; }
這段代碼結果是undefined,由於函數aheadOfStatement中的聲明瞭變量a,並覆蓋了全局變量a,可是沒有賦值。等價於下面的代碼:函數
var a=1; function aheadOfStatement(){ var a; alert(a); a=2; }
二、new的理解this
若是在一個函數前面帶上new來調用該函數,那麼將建立一個隱藏鏈接到該函數的prototype成員的新對象,同時this將被綁定到那個新對象上。spa
實例1:函數沒有返回值prototype
function testNoReturn(){ var a=1; } var test=testNoReturn(); var testWithNew=new testNoReturn(); alert(test); //undefined alert(testWithNew); //[object Object] alert(testWithNew instanceof testNoReturn); //true
實例2:函數返回基本類型;沒有new的,獲得a的值,有new的,獲得函數testWithReturn的prototype。code
function testWithReturn(){ var a=1; return a; } var test=testWithReturn(); var testWithNew=new testWithReturn(); alert(test); //1 alert(testWithNew); //[object Object] alert(testWithNew instanceof testWithReturn); //true
實例3:函數返回引用類型;沒有new的,獲得了Array類型的變量,有new的,也獲得了Array類型的變量,而不是獲得testWithReturn的prototype。htm
這個實例中,沒有new的,是構造函數的工廠模式;有new的,是構造函數的寄生構造函數模式。對象
function testWithReturn(){ var a=new Array(); a=[1,2,3]; return a; } var test=testWithReturn(); var testWithNew=new testWithReturn(); alert(test); //[1,2,3] alert(testWithNew); //[1,2,3] alert(testWithNew instanceof testWithReturn); //false
alert(test instanceof Array); //true alert(testWithNew instanceof Array); //true
//函數返回引用類型後,有沒有new,都獲得的是引用類型,有了new,也不返回函數的prototype
實例4:this綁定;有new的,this指向的是testWithNew。沒有this的,指向的是調用testThis的對象,在全局環境中是window。因此能夠找到a變量。blog
var a=1; function testThis(){ alert(this.a); this.b=2; } var test=testThis(); //1 var testWithNew=new testThis();//undefined alert(testWithNew.b);//2
ps:作用域
觀此博文(http://www.cnblogs.com/RitaRichard/archive/2011/10/12/2208902.html)有感,只想記錄知識點,實例大部分與其類似,望原做者見諒。