javascript
061_JavaScript闭包
1. 閉包(closure), 指的是函數可以使用函數之外定義的變量。
2. 簡單的閉包實例
2.1. 在JavaScript中使用全局變量是一個簡單的閉包實例。請思考下面這段代碼:
var message = "hello world";function sayHelloWorld() {alert(message); }sayHelloWorld();2.2. 在上面這段代碼中, 腳本被載入內存后, 并沒有為函數sayHelloWorld()計算變量message的值。該函數捕獲message的值只是為了以后的使用, 也就是說, 解釋程序知道在調用該函數時要檢查message的值。message 將在函數調用sayHelloWorld()時執行到alert(message);這一行被賦值, 顯示消息"hello world"。
3. 復雜的閉包
3.1. 在一個函數中定義另一個函數會使閉包變得更加復雜。例如:
var baseNum = 10;function addNum(num1, num2) {function doAdd() {return num1 + num2 + baseNum;}return doAdd(); }3.2. 這里, 函數addNum()包括函數doAdd()(閉包)。內部函數是一個閉包, 因為它將獲取外部函數的參數num1和num2以及全局變量baseNum的值。addNum()的最后一步調用了 doAdd(), 把兩個參數和全局變量相加, 并返回它們的和。
3.3. 這里要掌握的重要概念是, doAdd()函數根本不接受參數, 它使用的值是從執行環境中獲取的。
4. 更為復雜的閉包
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的賦值是自調用函數的返回值。
4.3.2. 這個自調用函數只運行一次。它設置計數器變量為零(0), 并返回對象。
4.3.3. 這樣myCounter成為了對象。最"精彩的"部分是它對象內部的函數訪問父作用域中的計數器變量。
4.3.4. 閉包指的是有權訪問父作用域的變量, 即使在父函數關閉之后。它使函數擁有"私有"變量成為可能。
總結
以上是生活随笔為你收集整理的061_JavaScript闭包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 060_JavaScript作用域
- 下一篇: 057_全局对象