1. 程式人生 > >js函式 函式自呼叫 返回函式的函式 (閉包)

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

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

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

100

n

n=1 以上這個符號代表1到100的相加,看到它理解成加和,而不是很簡單的加法運算;我們可以省了複雜的計算過程,直接思考高層次的邏輯。 函式是最基本的一種程式碼抽象方式。 首先需要清楚的瞭解一點:所有函式都是物件。 以下函式中obj()函式是一個函式物件,而函式名obj可以視為指向該函式的變數 比如我們定義一個函式可以這樣寫: function obj(a){  console.log(a) }; 還可以這樣寫: var obj= function(a){ console.log(a) } 函式內部的語句在執行時,一旦執行到return
時,函式執行完畢,並將結果返回。如果沒有return語句,函式執行完畢會返回結果,只是結果是undefined。 小心你的return語句: js語言有一個在行末自動新增分號機制, functionobj(a){  return   (a+"name") }; 與 functionobj(a){  return  (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>返回函式的函式
把一個動作分成兩步完成還可以實現一定的私密性。想象一下,我們需要兩個密碼開啟一把鎖,但是我們又不希望其中任何一個人知道另一個人的密碼。