js函式 函式自呼叫 返回函式的函式 (閉包)

GoToDinner發表於2017-10-25

轉 http://blog.sina.com.cn/s/blog_8f9d58d50102w331.html

什麼是函式:
①函式是重複計算使之簡化,修改常量方便。
②函式是數學中的抽象概念,我們看到一個符號就知道其中的計算,

100

n

n=1
以上這個符號代表1到100的相加,看到它理解成加和,而不是很簡單的加法運算;我們可以省了複雜的計算過程,直接思考高層次的邏輯。
函式是最基本的一種程式碼抽象方式。
首先需要清楚的瞭解一點: 所有函式都是物件
以下函式中 obj()函式是一個函式物件,而函式名 obj可以視為指向該函式的變數
比如我們定義一個函式可以這樣寫:
function obj(a){  <wbr>
console.log(a)
};
還可以這樣寫:
var obj= function(a){
console.log(a)
}

函式內部的語句在執行時,一旦執行到 return時,函式執行完畢,並將結果返回。如果沒有return語句,函式執行完畢會返回結果,只是結果是undefined。

小心你的return語句
js語言有一個在行末自動新增分號機制,
functionobj(a){  <wbr>
return  <wbr>  <wbr>
(a+"name")
};
functionobj(a){  <wbr>
return  <wbr>  <wbr> (a+"name")
};
返回的結果是不一樣的。

函式自呼叫:
所謂的函式自呼叫,就是在定義函式的時候直接呼叫。
比如:
var result =function (x){return x + 1;}(3);
這段程式碼的本質是:

var plusOne =function (x){
return x + 1;
};
var result = plusOne(3);

這樣寫就清楚了,我們先定義一個函式plusOne ,然後呼叫它,並提供實參3.
而上面的自呼叫的寫法就是把這兩件事放在一起完成了。
通過function (x){return x +1;}這一段程式碼,相當於寫了一個函式字面量(字面量詳見物件導向的三種建立方式),
而後面緊接著的(3)就是給這個函式字面量一個引數來呼叫它。換句話說,所有函式
類物件,不論是一個現場定義的匿名函式,還是一個之前定義的有名字的函式,他們不加
括號的時候都代表了這個函式物件本身,而加括號代表了呼叫這個函式,也就是這個函式
的return物件。

返回函式的函式:
剛才的例子:
var plusOne =function (x){
return x + 1;
};
var result = plusOne(3);
這裡的函式plusOne返回引數+1以後的值。
實際上一個函式是可以返回任何物件的,我們可以給plusOne再套一層:
js函式 <wbr>函式自呼叫 <wbr>返回函式的函式
plusOne是第一個真正被呼叫的函式,通過plusOne加括號,我們可以得到了
plusOne函式return的物件,也就是realFunction函式,再通過plusOne()(3)
我們得到了realFunction這個函式傳了引數3以後的return值,也就是4。(注意
對於最後一行來說,realFunction這個名字已經不存在了);
我們可以把x放在外面:
js函式 <wbr>函式自呼叫 <wbr>返回函式的函式
這裡我們相當於先把3告訴plusOne函式,然後由realFunction負責把plusOne活得的引數
加一,並返回。所以我們需要在第一個括號裡面傳3,第二個括號為空。
利用上面所說的返回函式的函式。可以做一些有趣的事情。
js函式 <wbr>函式自呼叫 <wbr>返回函式的函式
把一個動作分成兩步完成還可以實現一定的私密性。想象一下,我們需要兩個密碼開啟一把鎖,但是我們又不希望其中任何一個人知道另一個人的密碼。

相關文章