什麼是閉包
簡單的來講,就是乙個函式,乙個有權訪問另外乙個函式作用域內的變數的函式,
常見的建立閉包的方式就是在乙個函式內部建立另外乙個函式
問題又來了,什麼是函式作用域
先要介紹一下什麼是執行環境(環境),執行環境定義了變數或者函式有權訪問的其他資料,決定了它們各自的行為,每乙個環境都有乙個與之關聯的變數物件,環境中定義的所有的變數和函式都儲存在這個物件裡,私以為,這個變數物件就是作用域,
那什麼是變數物件
當某個函式被呼叫時,會建立乙個執行環境及相應的作用域鏈,然後使用arguments和其他命名引數的值來初始化函式的活動物件,因為這個環境是個函式,我們就把這個活動物件作為變數物件
什麼是作用域鏈
多個作用域連在一起,就是作用域鏈嘛,哈哈哈,js在建立乙個函式時會建立乙個包含全域性變數物件和本地活動物件(當前函式活動物件)作用域鏈,當我們訪問乙個物件屬性時,就會在作用域鏈上尋找,由內向外,直到查詢到這個物件或者全域性作用域為止
作用域本質上是乙個指向變數物件的指標列表,只引用不實際包含變數物件
所以
在內部函式的作用域鏈上有當前環境的變數物件和外部函式的活動物件,外部函式的作用域鏈又有外部函式的外部函式的活動物件,直至作用域的終點全域性執行環境
就是因為在內部函式的作用域鏈上能找到外部函式的活動物件,所以可以訪問到外部函式作用域內的變數
注: 一般當函式執行完畢後,區域性活動物件就會被銷毀,記憶體中僅保留全域性作用域,但是閉包有點不同,當內部函式被return後,外部函式的作用域鏈會被銷毀,但是活動物件仍然儲存在記憶體中,因為在內部函式的作用域鏈仍然引用這個活動物件,除非內部函式也被銷毀
作用域,閉包,作用域鏈
一,作用域 變數在宣告它的函式及該函式所巢狀的任意函式是有定義的 例var num 2 function fun fun 二,作用域鏈 多個函式巢狀在一起,多個作用域相互巢狀,這是作用域鏈 var num 1 function fun function fun2 fun1 fun2 fun 訪問原則...
作用域 作用域鏈 閉包
閉包概念中的一些專業名詞概念不清晰 作用域鏈 本質是乙個指向變數物件的指標列表。函式的作用域鏈在函式呼叫完成後即被銷毀。變數物件 全域性變數物件 js執行時一直存在 活動變數物件 區域性變數物件,函式執行完畢後銷毀 函式在呼叫時建立本地的活動物件加上函式定義時預建立的作用域鏈,形成乙個新的用於執行函...
簡述JS作用域 作用域鏈和閉包
定義 乙個變數的作用域是程式源 中定義這個變數的區域。全域性變數擁有全域性作用域,區域性變數只有區域性作用域。塊級作用域 在es6 let變數宣告出來之前,js是沒有塊級作用域的概念的,函式內部定義的變數才是區域性變數,具體見下面的 var a 1 for var i 0 i 10 i functi...