有什么方法可以在两个闭包之间共享代码吗?
例子:
// ANTIPATTERN
var cbDoThing = function cbDoThing(arg){
return typeof closed1 +" " + arg;
}
function getClosure1(closed1) {
return cbDoThing;
}
function getClosure2(closed1) {
return function(arg) {
// do other work
return cbDoThing(arg);
}
}
f1 = getClosure1();
f1("ARG1"); // returns "undefined ARG1"
f2 = getClosure2();
f2("ARG2"); // returns "undefined ARG2"
此处 getClosure1()
和 getClosure2()
返回一个执行类似任务的闭包。 IE。它们都需要在闭包环境中执行 cbDoThing()
,但 getClosure2()
还运行一些其他代码。
上面的例子不能正常工作。 cbDoThing()
是在全局上下文中定义的,因此 closed1 变量未定义。所需的行为是一种模式,使 closed1 变量可以从闭包作用域链中读取,但无需在每个闭包中重新定义 cbDoThing()
函数。
附言:JsFiddle playground .
编辑: 既然我问了,我得到了一个稍作修改的答案:
var cbDoThing = function cbDoThing(closed1, arg){
return closed1 +" " + arg;
}
function getClosure1(closed1) {
return function(arg) {
return cbDoThing(closed1, arg);
}
}
function getClosure2(closed1) {
return function(arg) {
// do other work
return cbDoThing(closed1, arg);
}
}
cbDoThing 不会从闭包变量范围访问 closed1 变量。相反,它传递了一个额外的参数。然后从每个闭包中调用此函数。
最佳答案
干得漂亮。 Javascript 只沿着原型(prototype)链向下走,这意味着 cbDoThing 没有引用或声明 closed1。在这种情况下,cbDoThing 只有一个原型(prototype)——Object。如果不显式地将参数传递给 cbDoThing,它将不会有任何 closed1 的概念。
这是对 javascript 中闭包的详尽讨论:http://jibbering.com/faq/notes/closures/
关于javascript - 共享关闭代码 (javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12251378/