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