作用域是在執行時**中的某些特定部分中變數,函式和物件的可訪問性 。簡單的說就好似變數能起到作用的範圍
區域性作用域(也可以叫做函式作用域)
一般只在固定的**片段內可訪問到,最常見的例如函式內部
如下:在我們在函式中用var關鍵字宣告乙個 變數 a 在函式外輸出a的值
function scope()
console.log(a); //報錯 (變數a未宣告)
scope();
//這裡的a只能在函式scope中訪問 所以a 擁有函式作用域
在函式scope中宣告的變數只能在函式scope中訪問 不可以在別的函式下訪問
如下:
function scope1()
scope1();
函式作用域中的函式作用域
function scope()
scope1();
console.log(b); //報錯 (變數b未宣告) }
console.log(a); //報錯 (變數a未宣告)
scope();
總結:函式作用域 在行數a中宣告也可以在函式a中訪問也可以在函式a裡面的函式使用
全域性作用域 :在**中任何地方都是訪問到的變數擁有全域性作用域
說到全域性作用域在js中有個全域性變數
全域性變數也就是擁有全域性作用域的變數
所有末定義直接賦值的變數自動宣告為擁有全域性作用域
我們在函式中定義乙個全域性變數
下面我們來用例項展示:
function scope()
function scope1()
console.log(a); //輸出10
scope1();
上面例項的a就是 沒有宣告 直接賦值 所以他是全域性變數 可以在函式scope() 中訪問也可以在函式scope1() 中訪問可以在函式外訪問
其實同過全域性變數我們就可以基本理解全域性作用是的什麼呢
全域性作用域就是可以在函式a中訪問也可以在函式b中訪問也可在函式外訪問
簡單是說全域性作用就是可以在任何地方訪問
全域性作用域的弊端:
如果我們寫了很多行 js **,變數定義都沒有用函式包括,那麼它們就全部都在全域性作用域中。這樣就會 汙染全域性命名空間, 容易引起命名衝突。
什麼是作用域鏈
如果要訪問a的值現在自己的活動範圍找如果早不到就找父級找 ,如果父級也沒呢?再一層一層向上尋找,直到找到全域性作用域還是沒找到,就宣布放棄。這種一層一層的關係,就是 作用域鏈 。
如下**:
var a = 10;
function scope()
scope2()
}scope1();
console.log(b);
} scope() ;
為了很好的理解我們先出從裡面的函式看起
function scope2()
scope2()
這裡要輸出a但是 scope2()中沒有宣告 a 那麼就要去他的父級scope1()裡面找 但是我們發現 scope1() 裡面也沒有 所以我們還要去 scope1()的父級 scope() 找 可以還沒有找到 只能在全域性作用域中找 找到了 var a = 10; 所以我們這裡輸出10
再看 scope1() 忽略掉 scope2()如下
unction scope1()
這裡要輸出b但是 scope1()中沒有宣告 b 那麼就要去他的父級scope()裡面找 我們發現 scope()中宣告了並賦值 var b = 20;所以我們這裡輸出20
在看 scope()
function scope()
這裡要輸出b但是 scope()中有宣告 b 並賦值 var b = 20;所以我們這裡輸出20
我們把上面的這個例項畫乙個圖
紅色的箭頭是鏈結的就是作用域鏈 表示 scope2 可以訪問 scop1 和scop 以及全域性作用域
scope1 可以訪問 scop 以及全域性作用域
scop 可以訪問 全域性作用域
通過以上作用域和這個例項我們可以總結出:
作用域是分層的,內層作用域可以訪問外層作用域的變數,反之則不行
JS作用域和作用域鏈
什麼是js作用域?js作用域也就是js識別變數的範圍 1 全域性作用域 2 區域性作用域 3 e6的塊級作用域 全域性作用域 也就是定義在window下的變數範圍,在任何地方都可以訪問 區域性作用域 是只在函式內部定義的變數範圍 塊級作用域 簡單來說就是用let和const在任意的 塊中定義的變數都...
js 函式中的作用域和作用域鏈
js看似有 塊級作用域 其實它沒有,取而代之的是 函式作用域 在乙個 塊 一對花括號內 定義的變數在 塊外部是不可見的,且在 塊執行結束後被釋放掉。定義在該函式中的引數和變數在函式外部不可見 例子1 而乙個函式內部任何位置定義的變數,在該函式內部任何地方都可見 例子2 解釋二 也就是說,變數不僅在宣...
Js 函式作用域和塊作用域
你不知道的js 第二版上捲第三章筆記 全域性作用域 定義在函式外部的變數,函式內部可以呼叫 區域性作用域 定義在函式內部的變數,函式外部不可以呼叫 塊級作用域 如同下面這個例子 for var i 1 i 10 i console.log i,b 輸出的還是 10 100!說明js沒有塊級作用域當我...