国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

javascript中eval函數用法分析

2019-11-20 12:36:28
字體:
來源:轉載
供稿:網友

本文實例分析了javascript中eval函數用法。分享給大家供大家參考。具體分析如下:

eval()只有一個參數,如果傳入的參數不是字符串,則直接返回這個參數。否則會將字符串當成js代碼進行編譯,如果編譯失敗則拋出語法錯誤(SyntaxError)異常。如果編譯成功則開始執行這段代碼,并返回字符串中的最后一個表達式或語句的值;如果最后一個表達式或語句沒有值,則最終返回undefined。如果字符串拋出異常,則該異常將把該調用傳遞給eval();

eval()最為重要的是,它使用了調用它的變量作用域環境,即它查找變量的值和定義新變量和函數的操作和局部作用域的代碼完全一樣。

eval("var x = 100");eval("var y = 11");console.log(x * y); //x * y == 1100eval("function foo(x){return Math.pow(x,x);}");console.log(foo(5)); // 25

eval字符串執行時的上下文環境和調用函數的上下文環境是一樣的,這不能使其作為函數的一部分來運行:

var foo = function(a){  eval(a);  };foo("return;");

以上代碼因為執行eval(a)的上下文是全局的,在全局上下文中使用return會拋出語法錯誤:return not in function.

eval()具有修改局部變量的能力,這對于js優化器來說是一個很大的問題。為了讓js解釋器實現更加簡化,ECMAScript3標準規定了任何解釋器都不允許對eval()賦予別名,如果eval()函數通過別名調用會拋出一個EvalError異常。
實際上大多數的實現不是這樣的。當通過別名調用時,eval()會將其字符串當成頂層的全局代碼來執行。執行代碼可能會定義新的全局變量和全局函數,或給全局變量賦值,但卻不能使用或修改主調用函數中的局部變量,因此不會影響到函數內部的代碼優化。

而在ECMAScript5中,態度有所不同:反對拋出EvalError異常。在ECMAScript5中當直接使用非限定名來調用eval()函數時,通常稱為”直接eval(direct eval)”;直接調用eval()時,總是在調用它的上下文作用域內執行。而其他的間接調用則使用全局對象作為其上下文作用域,且無法讀寫和定義局部變量和函數。(但實際我在firebug測試里發現,都是修改了全局變量 :( )

需要真正eval來執行代碼段的場景并不多見,可能更多的會使用全局eval而不是局部eval。

IE9之前的早期版本IE當通過別名調用eval()時并不是全局eval,但IE定義了一個execScript()的全局函數來完成全局eval的功能(單核eval()稍有不同,execScript()總是返回null)。

ECMAScript5嚴格模式對eval函數行為施加了更多的限制。在嚴格模式下使用eval或eval執行代碼以”use strict”指令開始時,eval是私有上下文環境中的局部eval.此外嚴格模式將eval列為保留字,這讓eval()更像一個運算符,不能用一個別名覆蓋eval()函數,并且變量名、函數名、函數參數或者異常捕獲的參數都不能取名為”eval”.

希望本文所述對大家的javascript程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武强县| 哈尔滨市| 祁阳县| 准格尔旗| 鄱阳县| 莱州市| 旌德县| 西乡县| 宿州市| 玉林市| 西和县| 西乌| 元氏县| 土默特右旗| 禹州市| 华池县| 五大连池市| 大港区| 吉水县| 五寨县| 玉溪市| 南丹县| 景东| 石门县| 阳高县| 龙南县| 平遥县| 长泰县| 阿鲁科尔沁旗| 若羌县| 虹口区| 霍州市| 麦盖提县| 微博| 大同市| 陈巴尔虎旗| 奉新县| 龙岩市| 讷河市| 大庆市| 许昌市|