深入淺析JS Function()構(gòu)造函數(shù)
js中function對(duì)象是一個(gè)令人著迷的東西,但由于他太過(guò)于靈活,常常令人迷惑.
先給大家看個(gè)代碼片段。
var scope="global";
function constructFunction(){
var scope="local";
return new Function(" return scope");
}
constructFunction()();
function constructFunction2(){
var scope="local";
return function(){
return scope;
}
}
constructFunction2()();
看到這兩個(gè)你的第一感覺(jué)是什么?都返回 "local"??,如果是這樣的話就需要好好看一下下面的講解了。constructFunction2()了解閉包的就應(yīng)該很容易的知道答案 是"local",這里就不細(xì)講了。下面我著重講一下constructFunction()的情況。
這里用到了 Function()構(gòu)造函數(shù), Function()構(gòu)造函數(shù)雖然不是很常用,但是了解一下還是很有必要的。
不管是通過(guò)函數(shù)定義語(yǔ)句還是函數(shù)直接量表達(dá)式,函數(shù)的定義都要使用 function()關(guān)鍵字。單函數(shù)還可以通過(guò)Function()構(gòu)造函數(shù)來(lái)定義,比如:
var f=new Function("x","y","return x*y");
這一行的實(shí)際效果和下面的一行代碼是等價(jià)的。
var f=function(x,y){x*y};
Function()構(gòu)造函數(shù)可以傳入任意數(shù)量的字符串實(shí)參,最后一個(gè)實(shí)參所表示的文本是函數(shù)體;它可以包含任意的Javascript 語(yǔ)句,每條語(yǔ)句之間用分號(hào)分割。傳入構(gòu)造函數(shù)的其他所有的實(shí)參字符串是指定函數(shù)的名字的字符串。如果定義的函數(shù)不包含任何參數(shù),只需給構(gòu)造函數(shù)簡(jiǎn)單地傳入 一個(gè)字符串函數(shù)體即可。
關(guān)于Function()構(gòu)造函數(shù)需要特別注意一下幾點(diǎn):
1.Function()構(gòu)造函數(shù)允許JavaScript在運(yùn)行時(shí)動(dòng)態(tài)的創(chuàng)建并編譯函數(shù)。
2.每次調(diào)用Function()構(gòu)造函數(shù)都會(huì)解析函數(shù)體,并創(chuàng)建新的函數(shù)對(duì)象。如果是在一個(gè)循環(huán)或者多次調(diào)用的函數(shù)中執(zhí)行這個(gè)構(gòu)造函數(shù),執(zhí)行效率會(huì)受到影響。相比之下,循環(huán)中的嵌套函數(shù)和函數(shù)定義表達(dá)式則不會(huì)每次執(zhí)行時(shí)都重新編譯。
2.最后的一點(diǎn),也是關(guān)于Function()構(gòu)造函數(shù)非常重要的一點(diǎn),就是它所創(chuàng)建的函數(shù)并不使用詞法作用域,相反,函數(shù)體代碼的編譯總是會(huì)在頂層函數(shù)執(zhí)行??赐赀@一點(diǎn),上面的函數(shù)constructFunction()();返回“global”應(yīng)該很容易理解了吧?
以上所述是小編給大家介紹的JS Function()構(gòu)造函數(shù),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
JS實(shí)現(xiàn)用戶(hù)注冊(cè)界面功能
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)用戶(hù)注冊(cè)界面功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
比較精簡(jiǎn)的Javascript拖動(dòng)效果函數(shù)代碼
比較精簡(jiǎn)的Javascript拖動(dòng)效果函數(shù)代碼...2007-07-07
淺談javascript函數(shù)劫持[轉(zhuǎn)自xfocus]
javascript函數(shù)劫持,也就是老外提到的javascript hijacking技術(shù)。最早還是和劍心同學(xué)討論問(wèn)題時(shí)偶然看到的一段代碼2008-02-02
zTree獲取當(dāng)前節(jié)點(diǎn)的下一級(jí)子節(jié)點(diǎn)數(shù)實(shí)例
下面小編就為大家?guī)?lái)一篇zTree獲取當(dāng)前節(jié)點(diǎn)的下一級(jí)子節(jié)點(diǎn)數(shù)實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
解決uni-app報(bào)錯(cuò)Error:?read?EBADF?at?Pipe?.?onStreamRead...
這篇文章主要介紹了uni-app報(bào)錯(cuò)Error:?read?EBADF?at?Pipe?.?onStreamRead...解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
如何解決java.lang.NumberFormatException: null異常
這篇文章主要介紹了如何解決java.lang.NumberFormatException: null異常問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
JS時(shí)間戳與日期格式的轉(zhuǎn)換小結(jié)
這篇文章主要介紹了JS時(shí)間戳與日期格式的轉(zhuǎn)換小結(jié),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01

