引擎會呼叫編譯器對源**進行編譯,其中編譯器編譯過程中遇到變數宣告會將其新增到當前作用域中,引擎執行編譯過後的**,遇到變數時會去作用域查詢。
當程式中含有var a = 2時,會分為「var a; a = 2;」兩個部分:①首先是編譯器檢視作用域,如果作用域已含有a則忽略該宣告(var a;)繼續編譯,否則會要求作用域在當前的集合中宣告乙個新的命名為a的變數(該步驟在**執行前執行)。②編譯器為引擎生成執行處理a = 2所需的**,引擎執行該**時會在當前的作用域集合中檢視是否有a,如果有的話會使用這個變數,沒有的話則會繼續查詢。 (ps:因為在編譯執行前將變數a加入作用域中,所以即使在宣告a之前呼叫它也不會報錯,因為當前作用域中已含有它,只不過執行到賦值語句前為undefined,這也就是通常所說的宣告提前。)
//引用型別:lhs和rhs,即賦值操作的左側和右側(也可理解為對變數賦值和使用變數的值)。因為對於引擎來說,它對於賦值和呼叫會對該次變數引用執行不同的操作,所以需要區分。lhs即類似a = 2,function f(a)中的a(被賦值),rhs即a = b + 2;console.log(b)中的b(被呼叫)不會報錯,因為在編譯執行之前,f 函式的上級作用域中已含有變數a的宣告,所以執行時會彈出undefined。
window.onload = function
() f();
var a = 0;
}
作用域是一層一層巢狀的,當引擎沒有在當前作用域中查詢到該變數時,它會向該作用域的上一層作用域繼續查詢,最上層為全域性作用域,再沒有找到則會報referenceerror異常。如圖,則會報錯,因為作用域只能向上查詢。
//有一種特殊情況:在非嚴格模式下(無"use strict"),當變數為lhs且未宣告時(即未宣告就賦值),全域性作用域會自動建立該變數並返回給引擎(這就是為什麼在函式中不宣告直接賦值,這個變數會變為全域性變數),開啟嚴格模式後則不會自動建立,報referenct錯誤。如下:會報錯,因為作用域只會向上查詢
window.onload = function
() alert(a);
}
//開啟(取消「use strict」注釋)後,則會報錯:當未開啟嚴格模式時,會彈出3
//"use strict";
window.onload = function
()
5. 如果找到變數對變數的值進行不合理的操作,比如試圖對乙個非函式型別變數進行函式呼叫,則會報typeerror異常。
在網上蒐羅了一些類似的例子,分享給大家,加深理解:
//輸出為number和undefined//輸出為undefined和string//輸出 1,undefined,2
x = 1;今天就寫到這裡啦,感覺看完第一章作用域的講解真的是受益匪淺,希望對你也有一定的啟發~。alert(x);
var y = function()
y();
python變數的作用域是什麼?
變數作用域 一般在函式體外定義的變數成為全域性變數,在函式內部定義的變數稱為區域性變數。全域性變數所有作用域都可讀,區域性變數只能在本函式可讀 函式在讀取變數時,優先讀取函式本身自有的區域性變數,再去讀全域性變數 全域性變數 讀,均可讀 賦值,global 字典,列表可修改 全域性變數全大寫 例如n...
python變數的作用域是什麼
變數作用域 一般在函式體外定義的變數成為全域性變數,在函式內部定義的變數稱為區域性變數。全域性變數所有作用域都可讀,區域性變數只能在本函式可讀 函式在讀取變數時,優先讀取函式本身自有的區域性變數,再去讀全域性變數 全域性變數 讀,均可讀 賦值,global 字典,列表可修改 全域性變數全大寫 例如n...
跨域是什麼?
跨域指的是不同伺服器之間不能相互訪問各自的資源或者資料,這出於乙個策略 同源策略 那麼為什麼要這麼設計呢,這是因為,一些 的資料可能涉及的使用者的隱私,因此不屬於當前伺服器的 時不能訪問它的,就比如,我們登陸 後,由不小心點進了其他的乙個釣魚 如果說不這麼設定,那麼釣魚 就可以獲取到你的登陸賬號和密...