Eval and new funciton not the same thing
更新時間:2012年12月27日 15:32:22 投稿:mdxy-dxy
以前有人會說,new Function的方式是幾乎與eval相等,今天我查了一下,確實是不同的東西,說這句話的人太不負(fù)責(zé)了。關(guān)于eval和new function,得到的結(jié)果都是一致的,都會叫你不要去使用它們。所以結(jié)論就是“不得不”才使用
1、函數(shù)聲明式
復(fù)制代碼 代碼如下:
function foo(){
//code
}
在JS中,函數(shù)也是對象,函數(shù)對象連接到Function.prototype( Function.prototype連接到Object.prototype)
2、函數(shù)字面量式
復(fù)制代碼 代碼如下:
var foo = function foo(){
//code
}
對象擁有一個連到原型對象的隱藏連接。對象字面量間生的對象連接到Object.prototype。 foo.__proto__ == Function.prototype
3、使用New的構(gòu)造函數(shù)生成
new Function ([arg1[, arg2[, ... argN]],] functionBody);
每次執(zhí)行都生成新的函數(shù)
網(wǎng)上的資料有很多介紹這三種模式的,前2種幾乎是相同的,基于相同的詞法作用域。
詞法作用域:變量的作用域是在定義時決定而不是執(zhí)行時決定,也就是說詞法作用域取決于源碼,通過靜態(tài)分析就能確定,因此詞法作用域也叫做靜態(tài)作用域。 with和eval除外,所以只能說JS的作用域機(jī)制非常接近詞法作用域(Lexical scope)。
突然感覺有點離題了,這篇文章其實是記錄eval和New Function的區(qū)別,下面回歸正題:
以前有人會說,new Function的方式是幾乎與eval相等,今天我查了一下,確實是不同的東西,說這句話的人太不負(fù)責(zé)了。關(guān)于eval和new function,得到的結(jié)果都是一致的,都會叫你不要去使用它們。所以結(jié)論就是“不得不”才使用。
eval() evaluates a string as a JavaScript expression within the current execution scope and can access local variables.
new Function()parses the JavaScript code stored in a string into a function object, which can then be called. It cannot access local variables because the code runs in a separate scope.
從以上2點看出,eval的作用域是現(xiàn)行的作用域,而new Function是動態(tài)生成的,它的作用域始終都是window。并且,eval可以讀到本地的變量,new Function則不能。
復(fù)制代碼 代碼如下:
function test() {
var a = 11;
eval('(a = 22)'); //如果是new Function('return (a = 22);')(); a的值是不會覆蓋的。
alert(a); // alerts 22
}
所以一般eval只用于轉(zhuǎn)換JSON對象,new Function也有特殊的用途,只是在不清楚的情況下還是少用為妙。
這里作個備份:
代碼:
復(fù)制代碼 代碼如下:
// 友善提醒:為了你的手指安全,請在Chrome下運(yùn)行
'alert("hello")'.replace(/.+/, eval);
'alert("hello")'.replace(/.+/, function(m){new Function(m)();});
var i = 0; eval(new Array(101).join('alert(++i);'));
var i = 0; new Function(new Array(101).join('alert(++i);'))();
相關(guān)文章
關(guān)于Ext中form移除textfield方法:hide(),setVisible(false),remove()
根據(jù)條件來控制是否顯示form里的textfield表單2010-12-12
微信小程序?qū)崿F(xiàn)客服功能(客服消息)的全過程
在最近做的微信小程序中需要實現(xiàn)一個自帶的客服功能,下面這篇文章主要給大家介紹了關(guān)于微信小程序?qū)崿F(xiàn)客服功能(客服消息)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
JavaScript使用math.js進(jìn)行精確計算操作示例
這篇文章主要介紹了JavaScript使用math.js進(jìn)行精確計算操作,結(jié)合實例形式分析了開源庫math.js進(jìn)行高精度數(shù)學(xué)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
JavaScript股票的動態(tài)買賣規(guī)劃實例分析上篇
這篇文章主要介紹了JavaScript對于動態(tài)規(guī)劃解決股票問題的真題例舉講解。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08

