js當一個變數為函數時 應該注意的一點細節小結

來源:互聯網
上載者:User

先看一段簡單的代碼:
複製代碼 代碼如下:
var testFun=function (name,age){
var job='Flash Develop';
return new testFun.init(name,age,job);
}
testFun.init=function(name,age,job){
return 'name:'+name+',age:'+age+',job:'+job+'';
}
alert(testFun('vincent',30)); //[object Object]

代碼很簡單,變數testFun為一個匿名函數,匿名函數返回的一個testFun.init對象(也是一個匿名函數)。但對於一些新手有時會誤解為:testFun是返回的一個testFun.init對象。他可能會這樣想,在匿名函數function(name,age)構建過程中,又用到了testFun. 此時testFun還在構建中,應該還沒有存在,testFun.init更沒有存在,怎麼就可以用testFun.init呢?

其實這樣想是存在了一個誤區:把testFun與testFun()等同起來了,如果testFun是返回的一個testFun.init對象,代碼應該是testFun=function(name,age){… …}()。正確的理解應該是這樣的,testFun只是一個函數,當你把一個函數賦於它時,它就已經存在了,哪怕函數返回的是undefined或null,它本身仍然是Function,只有testFun()執行後傳回值才是undefined或null。傳回值是testFun()執行的結果,結果返回後,就不再與testFun有任何關係。如:
複製代碼 代碼如下:
var testFun=function(){
return undefined;
}
var result=testFun();
alert(testFun); // function () {return undefined;}
alert(result); // undefined result與testFun不再有任何關係

所以,當賦於testFun一個匿名函數後,它就一直存在著,直到賦於它另外一個值。對於testFun.init你可以這樣簡單的去理解:
testFun.init=function(name,age){}.init=function(name,age.job){… …}
綜上所述,回頭再看testFun是一個函數,而testFun()則是(function(name,age,job){return 'name:'+name+',age:'+age+',job:'+job+''; })()
為了便於理解,可以把代碼精簡為:
複製代碼 代碼如下:
var testFun=function(){}
testFun.init=function(){}

只是testFun()沒有返回一個testFun.init對象罷了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.