javascript中eval函數(shù)用法分析
本文實例分析了javascript中eval函數(shù)用法。分享給大家供大家參考。具體分析如下:
eval()只有一個參數(shù),如果傳入的參數(shù)不是字符串,則直接返回這個參數(shù)。否則會將字符串當成js代碼進行編譯,如果編譯失敗則拋出語法錯誤(SyntaxError)異常。如果編譯成功則開始執(zhí)行這段代碼,并返回字符串中的最后一個表達式或語句的值;如果最后一個表達式或語句沒有值,則最終返回undefined。如果字符串拋出異常,則該異常將把該調(diào)用傳遞給eval();
eval()最為重要的是,它使用了調(diào)用它的變量作用域環(huán)境,即它查找變量的值和定義新變量和函數(shù)的操作和局部作用域的代碼完全一樣。
eval("var x = 100"); eval("var y = 11"); console.log(x * y); //x * y == 1100 eval("function foo(x){return Math.pow(x,x);}"); console.log(foo(5)); // 25
eval字符串執(zhí)行時的上下文環(huán)境和調(diào)用函數(shù)的上下文環(huán)境是一樣的,這不能使其作為函數(shù)的一部分來運行:
var foo = function(a){ eval(a); }; foo("return;");
以上代碼因為執(zhí)行eval(a)的上下文是全局的,在全局上下文中使用return會拋出語法錯誤:return not in function.
eval()具有修改局部變量的能力,這對于js優(yōu)化器來說是一個很大的問題。為了讓js解釋器實現(xiàn)更加簡化,ECMAScript3標準規(guī)定了任何解釋器都不允許對eval()賦予別名,如果eval()函數(shù)通過別名調(diào)用會拋出一個EvalError異常。
實際上大多數(shù)的實現(xiàn)不是這樣的。當通過別名調(diào)用時,eval()會將其字符串當成頂層的全局代碼來執(zhí)行。執(zhí)行代碼可能會定義新的全局變量和全局函數(shù),或給全局變量賦值,但卻不能使用或修改主調(diào)用函數(shù)中的局部變量,因此不會影響到函數(shù)內(nèi)部的代碼優(yōu)化。
而在ECMAScript5中,態(tài)度有所不同:反對拋出EvalError異常。在ECMAScript5中當直接使用非限定名來調(diào)用eval()函數(shù)時,通常稱為”直接eval(direct eval)”;直接調(diào)用eval()時,總是在調(diào)用它的上下文作用域內(nèi)執(zhí)行。而其他的間接調(diào)用則使用全局對象作為其上下文作用域,且無法讀寫和定義局部變量和函數(shù)。(但實際我在firebug測試里發(fā)現(xiàn),都是修改了全局變量 :( )
需要真正eval來執(zhí)行代碼段的場景并不多見,可能更多的會使用全局eval而不是局部eval。
IE9之前的早期版本IE當通過別名調(diào)用eval()時并不是全局eval,但IE定義了一個execScript()的全局函數(shù)來完成全局eval的功能(單核eval()稍有不同,execScript()總是返回null)。
ECMAScript5嚴格模式對eval函數(shù)行為施加了更多的限制。在嚴格模式下使用eval或eval執(zhí)行代碼以”use strict”指令開始時,eval是私有上下文環(huán)境中的局部eval.此外嚴格模式將eval列為保留字,這讓eval()更像一個運算符,不能用一個別名覆蓋eval()函數(shù),并且變量名、函數(shù)名、函數(shù)參數(shù)或者異常捕獲的參數(shù)都不能取名為”eval”.
希望本文所述對大家的javascript程序設計有所幫助。
相關文章
JavaScript中for of和for in的區(qū)別詳解
對于初學者,我們或許只知道無論是for of還是for in他們都有一個功能那就是遍歷,至于具體的細節(jié)或許我們不是很清楚,那么接下來我們就來詳細的區(qū)分一下for of和for in他們之間的不同點和相同點,需要的朋友可以參考下2023-06-06JS中Generator函數(shù)與async函數(shù)用法介紹
javascript中經(jīng)常會用到異步編程,在ES6之后我們使用的?Generator函數(shù)、async函數(shù)、promise都是我們異步編程的一大助力,這里我們主要講解Generator、async函數(shù),并且簡介他們之間的一些聯(lián)系,本篇文章會帶著一些簡易案例,方便大家理解使用2023-06-06使用JavaScript實現(xiàn)網(wǎng)頁秒表功能(含開始、暫停、繼續(xù)、重置功能)
這篇文章主要介紹了使用JavaScript實現(xiàn)網(wǎng)頁秒表(含開始、暫停、繼續(xù)、重置功能),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06