js函式的幾種寫法 閉包概要
- 2023-01-28
最常見的:
Js程式碼1functionfo
o() {2alert(‘hi,
js’);3}4foo();用
匿名函式:Js代
碼1varfoo
=function() {2alert(‘hi, js’);3}4foo();改裝一下,給呼叫的foo()加個括號:Js代
碼1varfoo =func
tion() {2alert(‘hi, js’);
來自
3}4(foo)();乾脆,連foo的定義也省掉————
把foo賦值語句的等號右
邊的東東、直接替換掉剛才括起來的foo
360問答
:Js程式碼1(functio
易執些遊省席變穩套息
n() {2alert
(‘hi, js’);3})
();先看常用的函式:1functionsay
草富了般水磁類並路帶
Hello(name) {2vartext = ‘H
ello ’ +nam
e;3varsayAlert =functio
寫效鎮職跳
n() { alert(
漢念景失續
text); }4sayAlert();5
}6sayHello(‘B
ob’);閉包的例子 一句話描述: 閉包是函式的區域性變數,在
音責軍
函式return
之後,仍然有值, 或者 閉包是s
tack-frame,在函式r
應南力車羅困且茶分腳臉
eturn的時候,它不會被
釋放。(就好像‘stack-
frame’是記憶體分配、而非處於堆疊!) 下
濟講組
面的程式碼返回一個function的引用:1functionsayHello2(name) {2vartex
職取憲集系參級唱很
t = ‘Hello ’ + na
me;//loc
al variable3va
rsayAlert =func
tion() { alert(text); }4re
材
turnsayAlert;5}6vars
ay2 = sayHello
2(‘Jane’);7say2();//hello Jan
精質該乎酒已
e C函式指標和JavaScript的函式引用有著本質的不同。在JavaScr
ipt,函式引用變
量既是一個函式指標,又是一個
隱藏的閉包指標。 在C和其他多
數語言,當函式retur
指寧舉阻單輕的
n之後,stack-frame就被銷燬了,所
有的區域性變數也就
不能訪問了。 在Jav
帝方馬廠皇問編主房
aScript中,如
果你在函數里聲明瞭函式
,在你呼叫的函式renturn之後,區域性變數仍然可以訪問。請注意上面的例子,我們呼叫
了變數text,它是函式s
ayHello2的區域性變數。Example 3 這個例子表明區域性變數不是複製傳遞,而是引用傳遞。在外層函式退出時,它把stack-frame儲存在記憶體。1functionsay667() {2
怕伯降圖留安械缺也領伯
//Local v
ariable t
hat ends up within closure3varnum = 666;
攻以送
4varsayAlert =f
迫養
unction(
) { alert(num)
; }5num++;6retur
nsayAlert;7}8v
arsayNumba
=say667();9sa
yNumba();//
殺巴
667,而不是66610alert(sayNumba。toString());Ex
低備兒價均婷精右需
ample 4 三個函式對某個閉包使用同一個引用,因為它們均在setupSomeGlobals()裡宣告的。1vargAlertNumber = gIncreaseNumber = gSetNumber =null;2functionsetupSomeGlobals() {3//Local variable that ends up within closure4varnum = 666;5//Store some references to functions as global variables6gAlertNumber =function() { alert(num); }7gIncreaseNumber =function() { num++; }8gSetNumber =function(x) { num =x; }9}10setupSomeGlobals();11//任意、多次 執行下面的函式12gAlertNumber();13gIncreaseNumber();14gSetNumber(5);//把num重新設為 515gSetNumber(-8888);//把num重新設為 -8888 重新執行setupSomeGlobals(); 就會重新產生一個新的閉包。在JavaScript中,當你在函數里又宣告一個函式,外部函式每呼叫一次,內部函式將再被重新產生一次。Example 5 當心下面例子的迴圈:閉包中的區域性變數可能和你最初想的不一樣。1functionbuildList(list) {2varresult =[];3for(vari = 0; i < list。length; i++) {4varitem = ‘item’ +list[i];5result。push(function() {alert(item + ‘ ’ + list[i])} );6}7returnresult;8}910functiontestList() {11varfnlist = buildList([1,2,3 ]);12//using j only to help prevent confusion - could use i13for(varj = 0; j < fnlist。length; j++) {14fnlist[j]();15}16}1718testList();//輸出3次:‘item3 undefined’Example 6 下面的例子表明,閉包包含了 在外部函式退出之前、定義的任何區域性變數。注意,變數alice實際上在匿名函式之後宣告的。匿名函式先被宣告:當函式被呼叫時,它可以訪問alice,因為alice在閉包裡。1functionsayAlice() {2varsayAlert =function() { alert(alice); }3//Local variable that ends up within closure4varalice = ‘Hello Alice’;5returnsayAlert;6}7sayAlice()();//Hello Alice8alert(alice);//錯誤:alice不是全域性變數,它在函式體內var了Example 7下面的例子表明,每次呼叫會產生各自的閉包。1functionnewClosure(someNum, someRef) {2//Local variables that end up within closure3varnum =someNum;4varanArray = [1,2,3];5varref =someRef;6returnfunction(x) {7num +=x;8anArray。push(num);9alert(‘num: ’ + num +10‘\nanArray ’ + anArray。toString() +11‘\nref。someVar ’ + ref。someVar);12}13}14closure1 = newClosure(40, {someVar : ‘closure 1’});15closure1(5);1617closure2 = newClosure(1000, {someVar : ‘closure 2’});18closure2(-10);小結讀一些說明要比理解上面的例子難得多。我對於閉包的說明以及stack-frame等等在技術上可能不正確 ——- 但是它們的確有助於理解
上一篇:有幸用於別人
下一篇:第44屆世界技能大賽幾號開賽?