js-提早聲明和new操做符理解

一、提早聲明:聲明變量後,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)有感,只想記錄知識點,實例大部分與其類似,望原做者見諒。

相關文章
相關標籤/搜索