javascript
讲讲JavaScript的闭包
簡介
函數和對其周圍狀態(lexical environment,詞法環境)的引用捆綁在一起構成閉包(closure)。也就是說,閉包可以讓你從內部函數訪問外部函數作用域。在 JavaScript 中,每當函數被創建,就會在函數生成時生成閉包。
簡單的來講,閉包就是一個函數里面嵌套一個函數。
function a (){var text = "func";function b(){console.log(text); };b(); } a(); // 輸出 func可見,嵌套函數可訪問聲明于它們外部作用域的變量。這也是閉包的作用之一。
實例
function makeFunc() {var name = "tom";function displayName() {alert(name);}return displayName; }var myFunc = makeFunc(); myFunc();第一眼看上去,也許不能直觀地看出這段代碼能夠正常運行。在一些編程語言中,一個函數中的局部變量僅存在于此函數的執行期間。一旦 makeFunc() 執行完畢,你可能會認為 name 變量將不能再被訪問。然而,因為代碼仍按預期運行,所以在 JavaScript 中情況顯然與此不同。
原因在于,JavaScript中的函數會形成了閉包。 閉包是由函數以及聲明該函數的詞法環境組合而成的。該環境包含了這個閉包創建時作用域內的任何局部變量。在本例子中,myFunc 是執行 makeFunc 時創建的 displayName 函數實例的引用。displayName 的實例維持了一個對它的詞法環境(變量 name 存在于其中)的引用。因此,當 myFunc 被調用時,變量 name 仍然可用,其值 tom就被傳遞到alert中。
用閉包模擬私有方法
在許多編程語言中是支持私有方法的,比如Java。
我們在JS里面可以用閉包模擬私有方法。
其實在日常JavaScript的使用中,我們天天在用閉包的私有方法。
比如說:
var num = Number.parseInt(3.14) console.log(num); // 3其中的Number.parseInt()
就是用的閉包模擬的私有方法。
使用私有方法的好處
- 私有方法不僅僅有利于限制對代碼的訪問
- 還提供了管理全局命名空間的強大能力
- 避免非核心的方法弄亂了代碼的公共接口部分。
實例
var makeCounter = function() {var privateCounter = 0;// 函數功能: 改變privateCounter的值function changeBy(val) {privateCounter += val;}return {increment: function() {changeBy(1);},decrement: function() {changeBy(-1);},value: function() {return privateCounter;}} };var Counter1 = makeCounter(); var Counter2 = makeCounter(); console.log(Counter1.value()); /* logs 0 */ Counter1.increment(); Counter1.increment(); console.log(Counter1.value()); /* logs 2 */ Counter1.decrement(); console.log(Counter1.value()); /* logs 1 */ console.log(Counter2.value()); /* logs 0 */請注意兩個計數器 Counter1 和 Counter2 是如何維護它們各自的獨立性的。每個閉包都是引用自己詞法作用域內的變量 privateCounter 。
每次調用其中一個計數器時,通過改變這個變量的值,會改變這個閉包的詞法環境。然而在一個閉包內對變量的修改,不會影響到另外一個閉包中的變量。
總結
以上是生活随笔為你收集整理的讲讲JavaScript的闭包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【复习】原生Js实现文件上传
- 下一篇: 【必备知识点】JavaScript里面那