亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript中的DSL元編程介紹

 更新時(shí)間:2015年03月15日 12:40:25   投稿:junjie  
這篇文章主要介紹了JavaScript中的DSL元編程介紹,本文講解了JavaScript元編程、JavaScript eval、JavaScript new Function()等內(nèi)容,需要的朋友可以參考下

在看JavaScript Template源碼的時(shí)候,發(fā)現(xiàn)有一個(gè)很有意思的用法用來生成函數(shù),想到這不就是元編程么?

JavaScript 元編程

復(fù)制代碼 代碼如下:

 元編程(Metaprogramming)是指某類計(jì)算機(jī)程序的編寫,這類計(jì)算機(jī)程序編寫或者操縱其他程序(或者自身)作為它們的數(shù)據(jù),或者在運(yùn)行時(shí)完成部分本應(yīng)在編譯時(shí)完成的工作。

JavaScript eval

復(fù)制代碼 代碼如下:

 eval() 函數(shù)可計(jì)算某個(gè)字符串,并執(zhí)行其中的的 JavaScript 代碼。

可以有下面的用法:
復(fù)制代碼 代碼如下:

eval("x=10;y=20;document.write(x*y)")

當(dāng)然這只是用來執(zhí)行某個(gè)函數(shù),只是這貨性價(jià)比可低了,而且還容易出錯(cuò)。
復(fù)制代碼 代碼如下:

 eval 函數(shù)應(yīng)該盡可能地避免使用。

于是更好地方法是使用New Function()

使用New Function()和eval()的很大一個(gè)區(qū)別是,eval不僅僅是一個(gè)函數(shù) ,

復(fù)制代碼 代碼如下:

 eval() 計(jì)算一個(gè)字符串作為當(dāng)前執(zhí)行范圍內(nèi)JavaScript表達(dá)式,可以訪問本地變量。 New Function() 解析存儲(chǔ)在一個(gè)字符串轉(zhuǎn)換成一個(gè)函數(shù)對(duì)象,然后可以調(diào)用的JavaScript代碼。因?yàn)榇a在一個(gè)單獨(dú)的范圍內(nèi)運(yùn)行,不能訪問本地變量。

也就是說eval()會(huì)干擾到當(dāng)前函數(shù)的作用域。。

JavaScript new Function()

 Function 構(gòu)造器創(chuàng)建一個(gè)新的Function 對(duì)象. 在JavaScript中每個(gè)函數(shù)(function)實(shí)際是一個(gè)Function對(duì)象. 使用Function構(gòu)造器生成的Function對(duì)象是在函數(shù)創(chuàng)建時(shí)被解析的。這比你使用函數(shù)聲明(function)并在你的代碼中調(diào)用低效,因?yàn)槭褂煤瘮?shù)語(yǔ)句聲明的function是跟其他語(yǔ)句一起解析的。

New Function() 相比之下會(huì)比較低效,而這也是當(dāng)前情況下我們所能預(yù)知的。

一個(gè)簡(jiǎn)單的示例如下所示:

復(fù)制代碼 代碼如下:

var add = new Function(['x', 'y'], 'return x + y');

new Function()會(huì)將字符串解析為函數(shù)。。然后我們可以通過apply來執(zhí)行
復(fù)制代碼 代碼如下:

Function.apply(null, args)

而這也是我在JavaScript Template中所看到的:
復(fù)制代碼 代碼如下:

   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隨機(jī)之洗牌算法深入分析

    javascript隨機(jī)之洗牌算法深入分析

    這篇文章主要介紹了javascript隨機(jī)之洗牌算法深入分析,同時(shí)提供了一個(gè)完整實(shí)例,需要的朋友可以參考下
    2014-06-06
  • GoJs分組繪圖模板go.Group使用示例詳解

    GoJs分組繪圖模板go.Group使用示例詳解

    這篇文章主要為大家介紹了GoJs分組繪圖模板go.Group使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • JavaScript 不只是腳本

    JavaScript 不只是腳本

    JavaScript 不只是腳本...
    2007-05-05
  • js字符串截取函數(shù)substr substring slice使用對(duì)比

    js字符串截取函數(shù)substr substring slice使用對(duì)比

    字符串截取函數(shù)有substr、substring以及slice等等,下面將為大家介紹下各自的使用,感興趣的朋友可以了解下
    2013-11-11
  • 詳解webpack babel的配置

    詳解webpack babel的配置

    本篇文章主要介紹了詳解webpack babel的配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • js?scrollTop如何到達(dá)指定位置

    js?scrollTop如何到達(dá)指定位置

    很早之前就想分享這篇心得,幸之今天能在這里完成,好了,話不多說,進(jìn)入正題。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • js chrome瀏覽器判斷代碼

    js chrome瀏覽器判斷代碼

    今天發(fā)現(xiàn)chrome還是有一些獨(dú)一無二的東西,基于它們,我們就可以搞出基于特征的判定了。
    2010-03-03
  • JavaScript中關(guān)于class的調(diào)用方法

    JavaScript中關(guān)于class的調(diào)用方法

    下面小編就為大家?guī)硪黄琂avaScript中關(guān)于class的調(diào)用方法。具有很好的參考價(jià)值,希望對(duì)大家有所幫助
    2017-11-11
  • 一文了解你不知道的JavaScript生成器篇

    一文了解你不知道的JavaScript生成器篇

    ES6引入了一個(gè)新的函數(shù)類型,發(fā)現(xiàn)它并不符合這種運(yùn)行到結(jié)束的特性。這類新的函數(shù)被稱為生成器。生成器的出現(xiàn)是我們知道原來有時(shí)代碼并不會(huì)順利的運(yùn)行,可以通過暫停的方式進(jìn)行異步回調(diào),讓我們摒棄了此前的認(rèn)知。本文就來聊聊JavaScript中生成器的相關(guān)知識(shí)
    2022-11-11
  • 實(shí)現(xiàn)js保留小數(shù)點(diǎn)后N位的代碼

    實(shí)現(xiàn)js保留小數(shù)點(diǎn)后N位的代碼

    最近在做項(xiàng)目的時(shí)候,遇到要保留小數(shù)點(diǎn)后N位的問題,經(jīng)過一番思索,最終完成了,這里記錄一下,下次需要直接就能拉出來用了
    2014-11-11

最新評(píng)論