这是一个javascript闭包的例子

时间:2014-08-14 15:41:50

标签: javascript closures

仍然觉得我对Javascript闭包的理解有时候有点毛茸茸,我想知道下面的代码是否代表闭包......

function StateManager () {
    var self = this;

    this.state = null;

    $(document).on("internal_StateManager_getState", function () {
        return self.state;
    });

    $(document).on("internal_StateManager_setState", function (e, p) {
        if ( p && p.state ) {
            self.state = p.state
        }

        return self.state;
    });
};

new StateManager();

alert( $(document).triggerHandler("internal_StateManager_setState", { "state": 88 }) );

是否准确地说这表明闭包是因为状态和自变量可通过事件访问?感谢您的任何意见!

1 个答案:

答案 0 :(得分:2)

在问题的代码中,StateManager函数不会创建闭包,因为它没有引用" free"来自它之外的变量的词汇范围。

然而,jQuery回调实际上是闭包,因为它们引用了self变量,该变量是在回调函数的词法范围之外定义的。

封闭是来自MDN

  

闭包是指独立(自由)变量的函数。

     

换句话说,闭包中定义的函数会记住'它创建的环境。

一个简单的例子就像是

function something() {

    var test = "Hello Kitty"; // "test" is a local variable created in this scope

    function otherFunc() { // this is an inner function, a closure
        alert( test ); // uses variable declared in the parent function
    }

}

这就像关闭一样简单,它只是另一个使用其外部变量的函数内部的函数。

另一个熟悉的例子是

$(document).ready(function() {  // creates outer scope

    var data = 'important stuff';

    $('.elems').on('click', function() { // this is a closure
         $(this).text( data ); // uses variable outside it's scope
    });

});