詞法欺騙 eval和with,盡量少用

2021-10-19 23:35:40 字數 1179 閱讀 8463

詞法欺騙:eval和with,盡量少用

function demo1(str,a)

var b =2;

demo1("var b=3",1)

eval("var b = 3"),在demo1內部宣告了乙個b變數,對已經存在的demo1的詞法作用域進行了修改,內部建立的b變數遮蔽了全域性作用域中同名的b變數。

因此當console.log(a,b)在demo1內部同時找到了a,b所以就不會向外部找了,因此輸出1,3

function demo2()

var b =2;

demo2("var b=3",1)

在嚴格模式下,eval有自己的詞法作用域,因此不會修改修改所在的詞法作用域。

類似於eval的還有settimeout,setinterval。他們的第乙個引數都可以是字串會被解釋為一段**。

(1)with方便的訪問物件

var obj = 

console.log(obj.a)//1

console.log(obj.b)//2

with(obj)

(2)with不僅僅有方便訪問物件的功能,還可以:

function foo(obj)

}var obj1 =

var obj2 =

foo(obj1)

console.log(obj1.a)//2

foo(obj2)

console.log(obj2.a)//undefined

console.log(a) //2

當obj1傳進去,a=2找到了obj1.a,將2賦值給它,第二個obj2傳進去並未找到obj.a,因此不會建立a這個屬性,所以obj2.a為undefined。

但是最後為什麼console.log(2)列印出來是2,因為a=2建立了乙個全域性變數a,並為其賦值為2

with可以將乙個沒有或有多個屬性的物件處理為乙個完全隔離的詞法作用域,因此這個物件的屬性

也會被處理我定義在這個作用域的詞法表示符。

注意:儘管with塊可以將乙個物件處理為詞法作用域,但是這個塊內部正常的var宣告並不會被限制

在這個快的作用域中,而是被新增到with所處的函式作用域中。

為什麼盡量不要使用eval函式和with關鍵字

編譯過程 分詞 詞法分析 解析 語法分析 生成 詞法作用域 定義在詞法階段的作用域 作用域 是一套規則,定義了引擎如何在作用域中通過識別符號名稱對變數進行查詢 作用域工作模型 詞法作用域 動態作用域 詞法化 編譯器工作的第一階段,即對 中的字元進行檢查。如果是有狀態的解析還會賦予單詞語義1.效能問題...

執行順序和eval

1 將命令切割成token 是以固定的一支煙meta字元分割的,有空格 製表符 換行符 與 token 的種類暴扣單詞,關鍵字 輸出入重定向 以及分號 2 檢查每個命令的第乙個token,看看是否他是不帶引號或者反斜槓的關鍵字,如果他是乙個開發的關鍵字,則這個命令其實是乙個復合命令 3 將每個命令的...

連續數字和盡量大

給定n個數字,你需要從中選出一些連續的數字,讓這些數的和盡量大。但是選出的數必須都大於等於x,小於等於y,且這些數不能超過z個 輸入描述 第一行輸入乙個整數t,代表有t組測試資料,對於每組測試資料,第一行輸入4個整數n,x,y,z,意義如題所示 第二行輸入空格隔開n個數a i 表示連續的n個數 1 ...