js中會改變作用域的兩個語句

2021-07-23 22:59:14 字數 1591 閱讀 1703

在非嚴格模式的情況下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...