这是一个简单的闭包用法:
function Thing() {
var _x;
return {
setX: function(val) { _x = val; },
getX: function() { return _x }
};
}
var a = Thing();
var b = Thing();
a.setX(12);
b.setX(23);
a.getX(); //returns 12
我想要做的是能够在setX
的定义之外定义getX
和Thing
的实现。
我试过这样的事情:
function setXimpl(val) {
_x = val;
}
function getXimpl() {
return _x;
}
function Thing() {
var _x;
return {
setX: setXimpl,
getX: getXimpl
};
}
var a = Thing();
var b = Thing();
a.setX(12);
b.setX(23);
a.getX(); //returns 23 not 12!
很明显,setXimpl
和getXimpl
正在设置/读取一些全局范围的_x
,而不是在闭包内。
我尝试了很多其他的东西(主要是语法上的修改),但我不能让外部函数成为Thing
闭包的一部分。有没有办法达到我想要的目的?
答案 0 :(得分:1)
你问题的答案非常简短。
闭包工作的原则是访问功能范围内的变量,这些变量在全局范围内是不可访问的。仅当执行获取/设置的函数是已返回的函数(创建闭包)内的嵌套函数时,才会发生这种情况。这意味着每次调用Thing
时都必须创建setX和getX的新函数,就像在Thing
代码中一样。
这并不意味着从Thing返回的函数不能通过使用(例如)IIFE来调用更接近全局范围的函数 定义事情:
var Thing = function(){
function a(...) {...}; // create once
function b(...) {...}; // create once
return function () { // the Thing function (create once)
var _x;
return {
setX: function(val) { _x = val; },
getX: function() { return _x }
};
};
}();
有效地赋予匿名getter和setter函数访问静态定义的封装函数帮助器。
答案 1 :(得分:0)
尝试工厂:
function setXimplLoader(x) {
return function setXimpl(val) {
x.value = val;
};
}
function Thing() {
var _x = { value: '' };
return {
setX: setXimplLoader(_x),
getX: function() { return _x.value; }
};
}
var a = Thing();
var b = Thing();
a.setX(12);
b.setX(23);
console.log(a.getX())
或者使用一些实用程序库: https://lodash.com/docs#partial