JavaScript中的DSL元編程介紹
在看JavaScript Template源碼的時(shí)候,發(fā)現(xiàn)有一個(gè)很有意思的用法用來生成函數(shù),想到這不就是元編程么?
JavaScript 元編程
元編程(Metaprogramming)是指某類計(jì)算機(jī)程序的編寫,這類計(jì)算機(jī)程序編寫或者操縱其他程序(或者自身)作為它們的數(shù)據(jù),或者在運(yùn)行時(shí)完成部分本應(yīng)在編譯時(shí)完成的工作。
JavaScript eval
eval() 函數(shù)可計(jì)算某個(gè)字符串,并執(zhí)行其中的的 JavaScript 代碼。
可以有下面的用法:
eval("x=10;y=20;document.write(x*y)")
當(dāng)然這只是用來執(zhí)行某個(gè)函數(shù),只是這貨性價(jià)比可低了,而且還容易出錯(cuò)。
eval 函數(shù)應(yīng)該盡可能地避免使用。
于是更好地方法是使用New Function()
使用New Function()和eval()的很大一個(gè)區(qū)別是,eval不僅僅是一個(gè)函數(shù) ,
eval() 計(jì)算一個(gè)字符串作為當(dāng)前執(zhí)行范圍內(nèi)JavaScript表達(dá)式,可以訪問本地變量。 New Function() 解析存儲在一個(gè)字符串轉(zhuǎn)換成一個(gè)函數(shù)對象,然后可以調(diào)用的JavaScript代碼。因?yàn)榇a在一個(gè)單獨(dú)的范圍內(nèi)運(yùn)行,不能訪問本地變量。
也就是說eval()會干擾到當(dāng)前函數(shù)的作用域。。
JavaScript new Function()
Function 構(gòu)造器創(chuàng)建一個(gè)新的Function 對象. 在JavaScript中每個(gè)函數(shù)(function)實(shí)際是一個(gè)Function對象. 使用Function構(gòu)造器生成的Function對象是在函數(shù)創(chuàng)建時(shí)被解析的。這比你使用函數(shù)聲明(function)并在你的代碼中調(diào)用低效,因?yàn)槭褂煤瘮?shù)語句聲明的function是跟其他語句一起解析的。
New Function() 相比之下會比較低效,而這也是當(dāng)前情況下我們所能預(yù)知的。
一個(gè)簡單的示例如下所示:
var add = new Function(['x', 'y'], 'return x + y');
new Function()會將字符串解析為函數(shù)。。然后我們可以通過apply來執(zhí)行
Function.apply(null, args)
而這也是我在JavaScript Template中所看到的:
new Function(
tmpl.arg + ',tmpl',
"var _e=tmpl.encode" + tmpl.helper + ",_s='" +
str.replace(tmpl.regexp, tmpl.func) +
"';return _s;"
);
當(dāng)然我們還有其他方法。
相關(guān)文章
JavaScript中DOM尺寸測量與節(jié)流技巧總結(jié)
在網(wǎng)頁開發(fā)中,合理獲取DOM元素尺寸及使用節(jié)流技術(shù)對高頻事件進(jìn)行優(yōu)化,是確保頁面流暢運(yùn)行的關(guān)鍵,通過JavaScript可以方便地獲取元素寬高,并應(yīng)用節(jié)流(Throttle)與防抖(Debounce)技術(shù)處理如滾動(dòng)或窗口調(diào)整等高頻事件,有效減少性能消耗,需要的朋友可以參考下2024-11-11
js 獲取html5的data屬性實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猨s 獲取html5的data屬性實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
Layui Form 自定義驗(yàn)證的實(shí)例代碼
今天小編就為大家分享一篇Layui Form 自定義驗(yàn)證的實(shí)例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
分享javascript計(jì)算時(shí)間差的示例代碼
這篇文章主要為大家介紹了javascript計(jì)算時(shí)間差的示例代碼,,一般來說都是計(jì)算當(dāng)前時(shí)間和一個(gè)指定時(shí)間點(diǎn)之間的差距,感興趣的小伙伴們可以參考一下2016-01-01
jqplot通過ajax動(dòng)態(tài)畫折線圖的方法及思路
這篇文章主要介紹了2013-12-12
微信小程序動(dòng)態(tài)評分展示/五角星展示/半顆星展示/自定義長度展示功能的實(shí)現(xiàn)
這篇文章主要介紹了微信小程序動(dòng)態(tài)評分展示/五角星展示/半顆星展示/自定義長度展示的實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
javascript中innerText和innerHTML屬性用法實(shí)例分析
這篇文章主要介紹了javascript中innerText和innerHTML屬性用法,實(shí)例分析了javascript中innerText和innerHTML屬性的作用和相關(guān)的使用技巧,需要的朋友可以參考下2015-05-05
Javascript簡單實(shí)現(xiàn)面向?qū)ο缶幊汤^承實(shí)例代碼
這篇文章主要介紹了Javascript簡單實(shí)現(xiàn)面向?qū)ο缶幊汤^承實(shí)例代碼,簡單分析了面向?qū)ο蟪绦蛟O(shè)計(jì)的特征與繼承的具體實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
firefox中用javascript實(shí)現(xiàn)鼠標(biāo)位置的定位
firefox中用javascript實(shí)現(xiàn)鼠標(biāo)位置的定位...2007-06-06

