摘要:作用域分為詞法作用域和動態作用域。這樣就形成了一個鏈式的作用域。一般情況下,當函數執行完畢時,里面的變量會被自動銷毀。而能夠訪問到這個在的編譯階段就已經定型了詞法作用域。
什么是作用域?
在當前運行環境下,可以訪問的變量或函數的范圍。
作用域分為詞法作用域和動態作用域。
詞法作用域是在js代碼編譯階段就確定下來的; 對應的,with和eval語句會產生動態作用域。
會產生新的作用域的情況:
函數
{}(ES6)
eval
舉個例子說明作用域
var a = "hello"; function f1(){ var a = 1; console.log(a); } f1(); // 1 console.log(a); // hello
可以看到f1中的變量a只能在f1中有效,f1外部訪問不到里面的a;所以在f1中的a,其作用域就只限定在f1中。
再來個新概念:作用域鏈
var a = "hello"; function f1(){ console.log(a);// ps: f1中并未聲明a } f1(); // hello
之所以輸出hello, 是因為在f1中并未找到a的定義,此時程序并不會急于拋異常,而是會向調用f1的上一層尋找a的定義。如果沒有,會繼續再往上一層的上一層尋找,直到最頂層。
這樣就形成了一個鏈式的作用域。
什么是閉包?
通常來講,函數可以訪問函數外面的變量;但是在函數外部,訪問不到在函數里面定義的變量。
function f1(){ var a = 1; } console.log(a); // Uncaught ReferenceError: a is not defined
那么有沒有可能訪問到f1中的a呢?當然是有的, 看例子:
function f1(){ var a = 1; function f2(){ return a; } return f2; } var getA = f1(); console.log(getA()); // 1
我們在f1中,添加了一個函數f2(實際上f2就可以看做一個閉包)。
一般情況下,當函數執行完畢時,里面的變量會被自動銷毀。但是因為我們把f2賦值給了外部的getA,所以f2不會被內存釋放,同理f2中使用的a在f2的作用域中,也不會被釋放,所以這個時候就可以訪問到a。
而getA能夠訪問到a,這個在js的編譯階段就已經定型了(詞法作用域)。
官方”的解釋是:閉包是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。
相信很少有人能直接看懂這句話,因為他描述的太學術。其實這句話通俗的來說就是:閉包就是能夠讀取其他函數內部變量的函數。
閉包的特點
閉包可以在函數外部改變函數中的變量的值,如果你把函數作為對象、閉包作為方法、局部變量作為私有屬性使用,則會改變該變量的值;閉包還會把函數中的變量的值存儲于內存中,對內存消耗很大,所以濫用閉包的結果就是影響網頁性能,IE中則可能導致內存泄露
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/110162.html
摘要:的分句會創建一個塊作用域,其聲明的變量僅在中有效。而閉包的神奇作用是阻止此事發生。依然持有對該作用域的引用,而這個引用就叫做閉包。當然,無論使用何種方式對函數類型的值進行傳遞,當函數在別處被調用時都可以觀察到閉包。 date: 16.12.8 Thursday 第一章 作用域是什么 LHS:賦值操作的目標是誰? 比如: a = 2; RHS:誰是賦值操作的源頭? 比如: conso...
摘要:建筑的頂層代表全局作用域。實際的塊級作用域遠不止如此塊級作用域函數作用域早期盛行的立即執行函數就是為了形成塊級作用域,不污染全局。這便是閉包的特點吧經典面試題下面的代碼輸出內容答案個如何處理能夠輸出閉包方式方式下一篇你不知道的筆記 下一篇:《你不知道的javascript》筆記_this 寫在前面 這一系列的筆記是在《javascript高級程序設計》讀書筆記系列的升華版本,旨在將零碎...
摘要:的變量作用域是基于其特有的作用域鏈的。需要注意的是,用創建的函數,其作用域指向全局作用域。所以,有另一種說法認為閉包是由函數和與其相關的引用環境組合而成的實體。 作用域 定義 在編程語言中,作用域控制著變量與參數的可見性及生命周期,它能減少名稱沖突,而且提供了自動內存管理 --javascript 語言精粹 我理解的是,一個變量、函數或者成員可以在代碼中訪問到的范圍。 js的變量作...
摘要:而閉包的神奇之處正是可以阻止事情的發生。拜所聲明的位置所賜,它擁有涵蓋內部作用域的閉包,使得該作用域能夠一直存活,以供在之后任何時間進行引用。依然持有對該作用域的引用,而這個引用就叫閉包。 引子 先看一個問題,下面兩個代碼片段會輸出什么? // Snippet 1 a = 2; var a; console.log(a); // Snippet 2 console.log(a); v...
摘要:作用域分類作用域共有兩種主要的工作模型。換句話說,作用域鏈是基于調用棧的,而不是代碼中的作用域嵌套。詞法作用域詞法作用域中,又可分為全局作用域,函數作用域和塊級作用域。 一篇鞏固基礎的文章,也可能是一系列的文章,梳理知識的遺漏點,同時也探究很多理所當然的事情背后的原理。 為什么探究基礎?因為你不去面試你就不知道基礎有多重要,或者是說當你的工作經歷沒有亮點的時候,基礎就是檢驗你好壞的一項...
閱讀 2022·2023-04-25 23:30
閱讀 1452·2021-11-24 10:18
閱讀 3070·2021-10-09 09:54
閱讀 2017·2021-10-08 10:05
閱讀 3431·2021-09-23 11:21
閱讀 3161·2019-08-30 15:52
閱讀 1560·2019-08-30 13:05
閱讀 1056·2019-08-30 13:02