資源描述:
《javascript必知必會(huì)(九)function說(shuō)起閉包問題_javascript技巧》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、JavaScript必知必會(huì)(九)function說(shuō)起閉包問題function函數(shù)格式functiongetPrototyNames(o,AoptionalVa){a二a
2、
3、[];for(varpino){a.push(p);}returna;}callerfunc.caller返冋函數(shù)調(diào)用者functioncal1func(){if(callfunc.caller){alert(callfunc.caller.toString());}else{alertC沒冇函數(shù)調(diào)用〃);}}functionhandleCaller(){c
4、allfunc();}handleCaller();//返冋handlercallfunc();//沒有函數(shù)調(diào)用,返回null,執(zhí)行了《沒有函數(shù)調(diào)用》callee匿名方法遞歸調(diào)用alert((function(x){if(x〈二)return;returnx*arguments.cal1ee(x-);}()));//scope作用域大家都不陌生,今天就來(lái)說(shuō)說(shuō)閉包問題,深刻吃透閉包問題。1、:定義的全局變量也能在函數(shù)內(nèi)部訪問。當(dāng)定義的局部變量和全局變量名字和同時(shí),局部變量的就會(huì)隱藏全局變量,不會(huì)破壞全局變量的值。varscope二"globalscope";functionf(){varscope=/zlocalscope";returnscope;}alert(f());//localscopealert(scope);//globalscope;上面確實(shí)是很容易理解,對(duì)吧。2、全局變量可以不用
6、var聲明,但是局部變量必須使用var聲明,如果局部變量不使用var聲明,編譯器會(huì)默認(rèn)這個(gè)是個(gè)全局變量。scope二"globalscope";functionf()scope="localscope";returnscope;}alert(f());//localscopealert(sco
7、pe);//Iocalscope但是全局變量不使用VH聲明,也僅限非嚴(yán)格模式,如果使用嚴(yán)格模式的話,會(huì)報(bào)錯(cuò)謀」iiie丄i丄:Console0▼」PreservelogOUncsught^eferenceErrcr:scopeis
8、norcefined所以建議大家聲明變量時(shí),千萬(wàn)不要省略可以避免不必要的麻煩。3、聲明提前,也是可以滴。什么叫什么捉前。{}Line17rColumn1Console0▼_JPreservelogundefinedglobalscope這個(gè)可能大家看出第一個(gè)打印undefined,是呀述沒有給他賦值,下而賦值可定打E卩g
9、lobalscope了。這樣理解并沒有錯(cuò),但是為什么會(huì)這樣的呢,一個(gè)變量不是應(yīng)該先定義才可以使用的嗎?這里給大家說(shuō)下作用域鏈,JavaScript是基于詞法作用域的語(yǔ)言。1、作用域鏈?zhǔn)且粋€(gè)對(duì)象或者鏈表,這組代碼小定義了這段代碼〃作用域小“的變量。當(dāng)JavaScript需要查找變量scope時(shí),就會(huì)從鏈中的第一個(gè)對(duì)象開發(fā)查找,如果第一個(gè)對(duì)象為scope,則會(huì)直接返回這個(gè)對(duì)象的值,如果不存在繼續(xù)第二對(duì)象開始查找,一直到找到。如果在作用域鏈上未查到該變量,則會(huì)拋岀一個(gè)錯(cuò)誤。我們口J以這個(gè)作用鏈口J以這樣表示:查找scope-〉wind
10、ow(全局對(duì)象)很顯然后面是有定義scope的。但是并沒有做賦值操作,后面才做賦值操作,所以此時(shí)值為undefined?4、這個(gè)比較具有迷惑性了,大家猜想下打卬的值是什么?