js函式的幾種寫法 閉包概要

  • 作者:由 匿名使用者 發表于 書法
  • 2023-01-28

js函式的幾種寫法 閉包概要games19882013-盾神妒響景建評如玉希10-11

最常見的:

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等等在技術上可能不正確 ——- 但是它們的確有助於理解

Top