在非嚴格模式的情況下eval可以接受乙個字串來動態的改變作用域,
eval("var a=12")
function
foo(str,a)
var b=4;
foo("var b=3",2);
console.log(window.a) //12
動態的給eval傳遞字串改變了function foo的作用域。而且第一句的 eval(「var a=12」)相當於宣告了乙個全域性變數。『
但是在嚴格模式(use strict)下eval()不能使用
"use strict";
eval("var a=12")
function
foo(str,a)
var b=4;
foo("var b=3",2);
console.log(window.a) //undefined
在輸出2,4的時候這個b是由全域性變數那來的。eval()不能再使用了。
所以eval()的使用不被提倡。
js中普通的with的用法
function
lakers
() var people=new lakers();
with(people)
會在螢幕上寫出
姓名: kobe bryant
年齡:28
性別:boy
with語句把a改變成了全域性變數
function
foo(obj)
}var ob1=;
foo(ob1);
console.log(ob1.a); //2
var ob2=;
foo(ob2);
console.log(ob2.a); //undefined
console.log(a); //with語句會把a給改變成了全域性變數
注意:嚴格模式下,js沒有with語句
"use strict";
function
foo(obj)
}var ob1=;
foo(ob1);
console.log(ob1.a); //2
var ob2=;
foo(ob2);
console.log(ob2.a); //undefined
console.log(a); //with語句會把a給改變成了全域性變數
程式就會報這樣的錯誤:
uncaught syntaxerror: strict mode code may not include a with statement
如果以上這兩句話如果在程式中出現次數太多的話,就會導致執行效率變慢。
因為如果引擎在**中發現了eval with 只能簡單的假設關於識別符號的位置的判斷都是無效的,因為無法在此法分析階段明確的知道eval()會接收到什麼樣的**。所以寫**的時候,一般都不會使用它,但是我們需要noon搞清楚這個原理。
js中可以改變作用域的三中方式(改變this)
第二種放方法 使用call 方法 有關call方法 window.color red var o function saycolor a,b saycolor red saycolor.call this,1,2 red saycolor.call window,1,2 red saycolor.c...
js中的作用域和作用域
作用域是在執行時 中的某些特定部分中變數,函式和物件的可訪問性 簡單的說就好似變數能起到作用的範圍 區域性作用域 也可以叫做函式作用域 一般只在固定的 片段內可訪問到,最常見的例如函式內部 如下 在我們在函式中用var關鍵字宣告乙個 變數 a 在函式外輸出a的值 function scope con...
js中的作用域
作用域 全域性作用域 區域性作用域 區域性作用域 在函式體中宣告的變數 只能在該函式體中訪問 全域性作用域 除了函式體中宣告的變數 或者在函式圖中沒有var 的變數。作用 在任何地方都可以訪問該變數 var 的變數便是全域性變數 var d ssss function sum b sum var a...