[英]Javascript closure defined elsewhere
这是闭包的简单用法:
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
我想做的是能够在Thing
的定义之外定义setX
和getX
的实现。
我尝试过这样的事情:
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
闭包的一部分。 有什么方法可以实现我想要的吗?
您问题的简短答案是“否”。
闭包的工作原理是在函数范围内访问在全局范围内无法访问的变量。 仅当执行获取/设置的函数是已返回的函数中的嵌套函数(创建闭包)时,才会发生这种情况。 这意味着每次调用Thing
都必须为setX和getX创建新函数,就像在Thing
代码中一样。
这并不意味着从Thing返回的函数不能通过使用(例如)IIFE定义Thing来调用更接近全局范围的静态函数:
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函数可以访问静态定义的封装函数助手。
尝试工厂:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.