Eval 和 new function 不是一回事_javascript技巧
1.函數宣告式
function foo(oo >//code
}
2、函數字面量式
//code
}
3、使用New的建構子產生
new Function ([arg1[, arg2[, ... argN]],] functionBody);
每次執行都會產生新的函數
網路上的資料有很多介紹這三種模式的,前2種幾乎是相同的,基於相同的詞法作用域。
詞法作用域:變數的作用域是在定義時決定而不是執行時決定,也就是說詞法作用域取決於源碼,透過靜態分析就能確定,因此詞法作用域也叫做靜態作用域。 with和eval除外,所以只能說JS的作用域機制非常接近詞法作用域(Lexical scope)。
突然覺得有點離題了,這篇文章其實是記錄eval和New Function的區別,下面回歸正題:
以前有人會說,new Function的方式是幾乎與eval相等,今天我查了一下,確實是不同的東西,說這句話的人太不負責了。關於eval和new function,得到的結果都是一致的,都會叫你不要去使用它們。所以結論就是「不得不」才使用。
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 in function string objtion the JavaScript be called. It cannot access local variables because the code runs in a separate scope.
從以上2點看出,eval的作用域是現行的作用域,而new Function是動態生成的,它的作用域始終都是window。並且,eval可以讀到本地的變量,new Function則不能。
function test() {
var = 111 ;
eval('(a = 22)'); //如果是new Function('return (a = 22);')(); a的值是不會覆寫的。
alert(a); // alerts 22
所以一般eval只用於轉換JSON對象,new Function也有特殊的用途,只是在不清楚的情況下還是少用為妙。
更多資料:邪惡的eval和new Function
這裡作個備份:
程式碼如下:
// 友善提醒:為了你的手指安全,請在Chrome下運行
'alert("hello")' .replace(/. /, eval);
'alert("hello")'.replace(/. /, function(m){new Function(m)();});

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

eval的意思是“評估”,是python中的一個內建函數,用於執行一個字串表達式,並返回表達式的計算結果;即變數賦值時,等號右邊的表示是寫成字串的格式,傳回值就是這個表達式的結果。語法“eval(表達式[, globals[, locals]])”。

win下php禁止eval的方法:1、下載「PHP_diseval_extension」;2、找到伺服器目前使用的PHP;3、開啟PHP設定檔 ;4、新增「extension=diseval.so」程式碼;5、重啟服務即可。

在Python中,eval() 函數用於執行一個字串表達式並傳回其結果。它可以將一個包含表達式的字串作為參數,並計算這個表達式的值。 eval() 函數的功能強大,但需要注意的是,它會執行字串中包含的任何有效的 Python 表達式,因此在使用時應避免接受外部輸入的字串,以防止安全漏洞。

eval在python中是一個內建函數,用於將字串作為程式碼進行解析和執行,並傳回執行結果。由於「eval」函數可以執行任意的Python程式碼,因此在使用"eval"函數時需要謹慎考慮安全性問題,如果給「eval」函數傳入不可信的字串,可能會導致程式碼注入等安全性問題。

Python的eval()我們可以使用內建的Pythoneval()[1]從基於字串或基於編譯程式碼的輸入動態地計算表達式。如果我們向eval()傳遞一個字串,那麼該函數會解析它,將其編譯為字節碼[2],並將其作為一個Python表達式進行計算。但如果我們用一個編譯過的程式碼物件呼叫eval(),那麼函數只執行計算步驟,如果我們用相同的輸入多次呼叫eval(),這就非常方便了。 Python的eval()的定義如下。 eval(expression[,globals[,locals]])該函數

1.概念在Java語言裡,「new」表達式是負責建立實例的,其中會呼叫構造器去對實例做初始化;構造器本身的回傳值類型是void,並不是「建構器回傳了新建立的物件的參考”,而是new表達式的值是新建立的物件的參考。 2.用途新建類別的物件3.工作機制為物件成員分配記憶體空間,並指定預設值對成員變數進行明確初始化執行建構方法計算並傳回參考值4.實例new操作往往意味著記憶體中的開啟新的記憶體空間,這個記憶體空間分配在記憶體中的堆區,受到jvm控制,自動進行記憶體管理。這裡我們就是用String這個類別來舉例說明。 pu

區別:1、make只能用來分配及初始化類型為slice、map、chan的資料;而new可以分配任意類型的資料。 2.new分配返回的是指針,即類型「*Type」;而make返回引用,即Type。 3.new分配的空間會被清除;make分配空間後,會初始化。
