在其他地方定义的 JavaScript 闭包
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
我想做的是能够定义setX
的实现,并在Thing
的定义之外定义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 时都必须创建 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 函数提供对静态定义的封装函数帮助程序的访问权限。
尝试工厂:
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
相关文章:
- for循环中的JavaScript闭包
- Javascript闭包-如何防止内存泄漏
- Javascript.闭包和dynamic'这'实际上具有约束力
- 用于添加两个数字的javascript闭包的用法
- 什么'这个javascript闭包的区别是什么
- 我可以使用JavaScript闭包添加数字吗
- javascript闭包:保护内部变量
- JavaScript闭包&回调函数
- 这些被认为是Javascript闭包吗
- JSHint 错误“对象不支持此属性或方法”用于 javascript 闭包
- JavaScript闭包的效果如何
- JavaScript 闭包和 for 循环
- 在谷歌地图示例中为 Ajax 调用制作一个 JavaScript 闭包
- JavaScript闭包和返回数组元素
- 如何在严格模式下实现以下JavaScript闭包
- 请解释这个Javascript闭包练习
- JavaScript闭包和变量引用
- Javascript闭包覆盖函数表达式
- Javascript闭包错误
- 为什么JavaScript闭包不能与预定义的函数一起使用