摘要:理解作用域作用域負責收集并維護由所有聲明的變量組成的集合,等待引擎的查找。當遇到時,編譯器會詢問作用域是否存在變量。詞法作用域就是定義在詞法階段的作用域。但函數不是唯一的作用域單元。塊作用域屬于某個代碼塊通常指內部。
理解作用域
作用域負責收集并維護由所有聲明的變量組成的集合,等待引擎的查找。
var a = 2; console.log(a); // 2 console.log(b); // ReferenceError: b is not defined
var a = 2 可以分解為var a; a = 2。當遇到var a時,編譯器會詢問作用域是否存在變量a。如果存在,則忽略該聲明,否則會在當前作用域的集合中聲明一個新的變量a。
遇到a = 2時,引擎會詢問當前作用域是否存在變量,如果未找到,則會繼續在上級作用域查找。如果最終找到就會將2賦值給變量a。
console.log(a)時,引擎會去作用域中查找 a,找到把結果返回,輸出2, console.log(b)時,引擎未在作用域查找到b,拋出異常。
LHS和RHS查詢可以看出"L"和"R"分別代表左側和右側,即賦值的左側和右側。賦值不只是=的賦值,函數參數的傳遞也是一種賦值操作。
var a = 2; // LHS查詢,a出現在賦值左側 console.log(a); // RHS查詢, a出現在賦值右側,將變量a賦值給參數
查詢失敗會出現什么情況
對于LHS查詢a = 2 若a未找到,在非嚴格模式下并不會報錯,而變量 a 會被自動創建。而對于 RHS 來說,直接使用未聲明的變量就會報 ReferenceError。
console.log(b); // ReferenceError: b is not defined詞法作用域
作用域主要有兩種工作模型:詞法作用域和動態作用域。
詞法作用域就是定義在詞法階段的作用域。換句話說,詞法作用域是由你寫代碼時變量和塊作用域寫在哪決定的。
function foo(a) { var b = a * 2; function bar(a) { console.log(a, b, c); } bar(b*3); } foo(2);
在這個例子有三個逐級嵌套的作用域。
全局作用域,包含一個標識符:foo
foo所創建的作用域,包含三個標識符:a, bar, b
bar所創建的作用域,包含一個標識符:c
函數作用域函數作用域是指屬于這個函數的變量都可以在整個函數范圍內使用和復用。
function fn() { var a = 2; console.log(a); // 2 } console.log(a); // ReferenceError: a is not defined
從中可以看出,函數外部將無法訪問函數內部的變量。
塊作用域ES6引入let、const將變量綁定到所在塊作用域(通常是{...}內部)
{ let a = 2; console.log(a); // 2 } console.log(a); // ReferenceError: a is not defined
除let、const外,with、try/catch的catch分句會創建一個塊作用域。
小結函數是Javascript中最常見的作用域單元。但函數不是唯一的作用域單元。塊作用域屬于某個代碼塊(通常指{...}內部)。
接下來會講解提升和閉包兩個概念。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/105163.html
摘要:將作用域賦值給變量這里的作用域是,而不是將作用域賦值給一個變量閉包返回瀏覽器中內存泄漏問題大家都知道,閉包會使變量駐留在內存中,這也就導致了內存泄漏。 上一章我們講了匿名函數和閉包,這次我們來談談閉包中作用域this的問題。 大家都知道,this對象是在運行時基于函數的執行環境綁定的,如果this在全局就是[object window],如果在對象內部就是指向這個對象,而閉包卻是在運行...
摘要:但是函數返回了內部函數,內部函數會隨時訪問變量所以垃圾回收機制是不會回收函數的內部作用域的,這就是閉包的含義。也就是函數在定義的詞法作用域以外的地方被調用,閉包使得函數可以繼續訪問定義時的詞法作用域。 初學JavaScript閉包時,閉包這個概念在我眼里及其的神秘,也不知道這個東西在講什么,尤其某些地方的閉包概念定義的非常抽象,屬于那種本來你可能明白這個概念,看了反而又把你給繞糊涂...
摘要:我們在面試時,總會碰到一些奇奇怪怪的關于作用域的面試題,其實弄清楚原理,萬變不離其宗,大部分的面試題都可以得姐。 showImg(https://segmentfault.com/img/bV7Cri?w=1563&h=879); 我們在面試時,總會碰到一些奇奇怪怪的關于 作用域 的面試題,其實弄清楚原理,萬變不離其宗,大部分的面試題都可以得 ‘姐’。 所以,今天我們來談談 JavaS...
摘要:在內部,理所當然能訪問到局部變量,但當作為的返回值賦給外的全局變量時,神奇的事情發生了在全局作用域中訪問到了,這就是閉包。而閉包最神奇的地方就是能在一個函數外訪問函數中的局部變量,把這些變量用閉包的形式放在函數中便能避免污染。 一、閉包是什么? 《JavaScript高級程序設計》中寫道:閉包是指有權訪問另一個函數作用域中的變量的函數,如果用下定義的觀點看,這句話就是說閉包是函數,我...
閱讀 1170·2021-11-16 11:45
閱讀 1034·2021-09-04 16:41
閱讀 3085·2019-08-29 16:40
閱讀 2863·2019-08-29 15:34
閱讀 2680·2019-08-29 13:11
閱讀 1742·2019-08-29 12:58
閱讀 1735·2019-08-28 18:00
閱讀 1783·2019-08-26 18:26