仍然觉得我对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 }) );
是否准确地说这表明闭包是因为状态和自变量可通过事件访问?感谢您的任何意见!
答案 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
});
});