1.js引擎、編譯器、作用域。
引擎:負責js全過程的編譯和執行;
編譯器:負責語法分析和**生成;
作用域:負責收集並維護宣告組成的查詢,以及當前執行**對這些變數的訪問許可權(簡言之,作用域就是用於編譯和執行的一套規則)。
三者的關係:編輯器要編譯的時候會詢問作用域,引擎要執行**的時候也會詢問作用域。
2.lhs和rhs查詢都是從當前執行作用域開始,若沒找到所需識別符號,以此向上級作用域查詢,直到頂層作用域,若仍未找到,會丟擲referenceerror異常(typeerror這個異常,是操作非法引起的)。
3.嚴格模式("use strict")不允許自動或隱式建立全域性變數。
即:用了嚴格模式,如果沒有定義某個變數會丟擲reffrenceerror的異常,但如果非嚴格模式,則不會報錯,因為編譯器會給它隱式建立乙個全域性變數。
4.函式表達是可以避免定義變數名為undefined時引發的異常,同時可以避免汙染全域性作用域。(函式表示式可粗略理解為:作為引數的函式)
(function foo())();//最後這個括號表示立即執行表示式。
////////函式表示式傳參/////////
var a = 2;
(function foo(global))(window)
5.編譯過程中,函式和變數可以提公升,且函式提公升優先變數提公升(如果命名相同的話),所以**執行順序不一定是我們寫**的順序;
例1:a = 2;
var a;
console.log( a );//2
////////////////////////
例2:console.log( a );//引發reffrenceerror
var a = 2;
原因:編譯器編譯時分兩步走,第一步定義宣告,第二步賦值宣告(這步會滯留,直到進行到執行階段)
所以上述**執行順序:
例1:var a;
a = 2;
console.log(2);
例2:var a;
console.log(a);//定義了,但未賦值,故輸出undefined.
a = 2;
所謂提公升,就是在編譯的時候把寫在後面的**優先宣告了。比如可以在宣告的某個函式/變數之前就呼叫它而不報錯,下面這個**自己敲敲、體會體會
JS作用域和作用域鏈
什麼是js作用域?js作用域也就是js識別變數的範圍 1 全域性作用域 2 區域性作用域 3 e6的塊級作用域 全域性作用域 也就是定義在window下的變數範圍,在任何地方都可以訪問 區域性作用域 是只在函式內部定義的變數範圍 塊級作用域 簡單來說就是用let和const在任意的 塊中定義的變數都...
js中的作用域和作用域
作用域是在執行時 中的某些特定部分中變數,函式和物件的可訪問性 簡單的說就好似變數能起到作用的範圍 區域性作用域 也可以叫做函式作用域 一般只在固定的 片段內可訪問到,最常見的例如函式內部 如下 在我們在函式中用var關鍵字宣告乙個 變數 a 在函式外輸出a的值 function scope con...
Js 函式作用域和塊作用域
你不知道的js 第二版上捲第三章筆記 全域性作用域 定義在函式外部的變數,函式內部可以呼叫 區域性作用域 定義在函式內部的變數,函式外部不可以呼叫 塊級作用域 如同下面這個例子 for var i 1 i 10 i console.log i,b 輸出的還是 10 100!說明js沒有塊級作用域當我...