作用域鏈 嚴格模式

2021-09-14 00:47:29 字數 1886 閱讀 7468

作用域鏈

迷惑性**

var a = 100;

function test()

function testfun()

不假思索的想到 出書的一定是 200啊 ,然而結結實實被打臉,輸出 100

原因

在編譯時,

全域性作用域中會存有的物件

testfun作用域中存的

test

在執行時,

test() 我這裡需要變數a 啊,但是在test的作用域中並不存在,那麼就需要去全域性作用域中尋找 a,報告老大找到了,輸出全域性作用域中的a,輸出100

迷惑性**

var a = 100;

function testfun2()

test();

}testfun2();

輸出什麼? 300!

?!為什麼呢

作用域鏈再走一波

1.全域性作用域

testfun2

test

執行時test時,報告老大,我需要變數a ,test作用域:我沒有啊,你去看看testfun2有沒有;

testfun2作用域:我有 給你拿去好了;

輸出 300

嚴格模式

例項

'use strict';

x = 3.14; // 報錯(x 未定義)

'use strict'

myfunction();

function myfunction()

// 不允許刪除變數或物件

'use strict';

var x = 3.14;

delete x ;

// 不允許刪除函式

'use strict';

function x(p1,p2){};

delete x ;

// 報錯

// 不允許變數重名

'use strict';

function x(p1,p1){} // 報錯

// 不允許使用八進位制

'use strict';

var x = 010; // 報錯

// 不允許使用轉義字元

'use strict';

var x= \010; // 報錯

//  不允許對唯讀屬性賦值

'use strict';

var obj ={};

object.defineproperty(obj,'x',);

obj.x = 3.14;

// 不允許對乙個使用 getter方法讀取的屬性進行賦值

'use strict';

var obj =};

obj.x=3.14; // 報錯

// 變數名 不能使用 'eval'字串

'use strict';

var eval = 3.14; // 報錯

//變數名不能使用 'arguments'字串

'use strict';

var arguments = 3.14; //報錯

// 禁止 this 關鍵字指向全域性物件

function test()

嚴格模式新增的一些保留關鍵字

作用域 作用域鏈

理解 就是一塊 地盤 乙個 段所在的區域 它是靜態的 相對於上下文物件 在編寫 時就確定了 分類全域性作用域 函式作用域 沒有塊作用域 es6有了 作用隔離變數,不同作用域下同名變數不會有衝突 區別1全域性作用域之外,每個函式都會建立自己的作用域,作用域在函式定義時就已經確定了。而不是在函式呼叫時 ...

作用域和作用域鏈

全域性作用域 全域性的變數執行環境 函式作用域 函式內部的變數執行環境 每個函式都有自己的執行環境,當執行流進入乙個函式時,函式的環境就會被推入乙個環境棧中。函式執行之後,棧將環境彈出,把控制權返回給之前的執行環境。全域性作用域只要頁面不解除安裝,就一直存在,不釋放。函式每次在呼叫時,都會形成乙個作...

作用域和作用域鏈

var a 10 function f1 x,y f1 console.log b 此時b輸出5,因為b 5為隱式的全域性變數 在函式外面使用var 宣告的變數都是全域性變數,作用範圍是程式執行的地方.全域性作用域 函式除外 函式的形參是區域性變數 在函式內部,不使用var 定義的變數,叫隱式全域性...