061_JavaScript闭包
1. 閉包(closure), 指的是函數(shù)可以使用函數(shù)之外定義的變量。
2. 簡單的閉包實(shí)例
2.1. 在JavaScript中使用全局變量是一個(gè)簡單的閉包實(shí)例。請(qǐng)思考下面這段代碼:
var message = "hello world";function sayHelloWorld() {alert(message); }sayHelloWorld();2.2. 在上面這段代碼中, 腳本被載入內(nèi)存后, 并沒有為函數(shù)sayHelloWorld()計(jì)算變量message的值。該函數(shù)捕獲message的值只是為了以后的使用, 也就是說, 解釋程序知道在調(diào)用該函數(shù)時(shí)要檢查message的值。message 將在函數(shù)調(diào)用sayHelloWorld()時(shí)執(zhí)行到alert(message);這一行被賦值, 顯示消息"hello world"。
3. 復(fù)雜的閉包
3.1. 在一個(gè)函數(shù)中定義另一個(gè)函數(shù)會(huì)使閉包變得更加復(fù)雜。例如:
var baseNum = 10;function addNum(num1, num2) {function doAdd() {return num1 + num2 + baseNum;}return doAdd(); }3.2. 這里, 函數(shù)addNum()包括函數(shù)doAdd()(閉包)。內(nèi)部函數(shù)是一個(gè)閉包, 因?yàn)樗鼘@取外部函數(shù)的參數(shù)num1和num2以及全局變量baseNum的值。addNum()的最后一步調(diào)用了 doAdd(), 把兩個(gè)參數(shù)和全局變量相加, 并返回它們的和。
3.3. 這里要掌握的重要概念是, doAdd()函數(shù)根本不接受參數(shù), 它使用的值是從執(zhí)行環(huán)境中獲取的。
4. 更為復(fù)雜的閉包
4.1. 代碼
<!DOCTYPE html> <html lang="zh-CN"><head><meta charset="utf-8" /><title>閉包</title></head><body><script type="text/javascript">var myCounter = (function () {var counter = 0;return {increase: function() {return counter += 1;}, decrease: function() {return counter -= 1;}, clear: function() { return counter = 0;}};})();document.write('counter = ' + myCounter.increase() + '<br />');document.write('counter = ' + myCounter.increase() + '<br />');document.write('counter = ' + myCounter.increase() + '<br />');document.write('counter = ' + myCounter.decrease() + '<br />');document.write('counter = ' + myCounter.clear() + '<br />');document.write('counter = ' + myCounter.increase() + '<br />');</script></body> </html>4.2. 效果圖
4.3. 例子解釋
4.3.1. 變量myCounter的賦值是自調(diào)用函數(shù)的返回值。
4.3.2. 這個(gè)自調(diào)用函數(shù)只運(yùn)行一次。它設(shè)置計(jì)數(shù)器變量為零(0), 并返回對(duì)象。
4.3.3. 這樣myCounter成為了對(duì)象。最"精彩的"部分是它對(duì)象內(nèi)部的函數(shù)訪問父作用域中的計(jì)數(shù)器變量。
4.3.4. 閉包指的是有權(quán)訪問父作用域的變量, 即使在父函數(shù)關(guān)閉之后。它使函數(shù)擁有"私有"變量成為可能。
總結(jié)
以上是生活随笔為你收集整理的061_JavaScript闭包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 060_JavaScript作用域
- 下一篇: 004_JavaScript版本