Javascript 依赖闭包是否可以阻止将公共js代码移动到函数中?
这可能是一个愚蠢的问题,但我似乎不能利用谷歌,因为所有的“关闭101”链接 总之,给定依赖于闭包上下文的重复代码,有没有一种方法可以将代码重复消除到函数调用中,同时新函数仍然依赖于闭包,而不是通过参数传递它所需的一切 粗略的代码示例可能如下所示:Javascript 依赖闭包是否可以阻止将公共js代码移动到函数中?,javascript,closures,Javascript,Closures,这可能是一个愚蠢的问题,但我似乎不能利用谷歌,因为所有的“关闭101”链接 总之,给定依赖于闭包上下文的重复代码,有没有一种方法可以将代码重复消除到函数调用中,同时新函数仍然依赖于闭包,而不是通过参数传递它所需的一切 粗略的代码示例可能如下所示: function doWork(){ // initialize variables // manipulate variables // ... $.ajax({ //... succes
function doWork(){
// initialize variables
// manipulate variables
// ...
$.ajax({
//...
success: function(data){
// DUPLICATE CODE INSTANCE 1 HERE
// RELIES ON VARIABLES IN THE CLOSURE
}
});
// More code
$.ajax({
//...
success: function(data){
// DUPLICATE CODE INSTANCE 2 HERE
// RELIES ON VARIABLES IN THE CLOSURE
}
});
}
据我所知,如果我将成功块中的逻辑重复数据消除到
function onSuccess(...){
// ...
}
然后onSuccess不再是闭包的一部分,因此需要将所有闭包变量作为参数传递给当前逻辑使用闭包访问的地方
关于闭包的工作方式,我错了吗?有没有一种方法可以“传递闭包”给onSuccess函数,而不是传递单个变量?除非您在闭包中定义它
function doWork(){
// initialize variables
// manipulate variables
// ...
function onSuccess(data){
// DUPLICATE CODE INSTANCE 2 HERE
// RELIES ON VARIABLES IN THE CLOSURE
}
$.ajax({
//...
success: onSuccess
});
// More code
$.ajax({
//...
success: onSuccess
});
}
关于闭包行为,您没有错。您可以在
doWork
中声明onSuccess
函数
function doWork(...) {
function onSuccess(...) {
// ...
}
$.ajax({
//...
success: onSuccess
});
$.ajax({
//...
success: onSuccess
});
}
您可以通过使用
this.var
将所需内容转换为与public
变量等价的JavaScript。然后可以将this
的引用传递给闭包范围之外的对象,并访问传递的闭包的属性和方法(从this
)。以以下代码为例:
var Work = function Work() {};
Work.prototype = {
closureVar: "hello",
closureOnSuccess: function () {
console.log("Inner call:" + this.closureVar);
},
someCall: function () {
globalOnSuccess(this);
this.closureOnSuccess();
}
};
var globalOnSuccess = function (context) {
console.log("Outer call:" + context.closureVar);
};
var work = new Work();
work.someCall();
根据@danp指南编辑:
var Work = function Work() {
this.closureVar = "hello";
this.closureOnSuccess = function () {
console.log("Inner call:" + this.closureVar);
}
this.someCall = function() {
globalOnSuccess(this); //Give the global function a reference to this closure
this.closureOnSuccess();
}
this.someCall();
}
var globalOnSuccess = function (context) { //context is a reference to a closure
console.log("Outer call:" + context.closureVar);
}; //Globally scoped function
var work = new Work();
还有一个例子:
var Work = function Work() {};
Work.prototype = {
closureVar: "hello",
closureOnSuccess: function () {
console.log("Inner call:" + this.closureVar);
},
someCall: function () {
globalOnSuccess(this);
this.closureOnSuccess();
}
};
var globalOnSuccess = function (context) {
console.log("Outer call:" + context.closureVar);
};
var work = new Work();
work.someCall();
我害怕投票,所以我不会毁了你的分数…=)它已经在666上停留了很长一段时间…+1,你以前的分数让我很紧张-这将有助于解决问题的一部分愿望是,嫁妆功能开始变得越来越大。。。我希望onSuccess在外部清理代码库。另外,在onSuccess定义之后初始化的doWork中的变量是否仍然可以访问onSuccess的闭包?是的,
doWork
中的所有变量都可以通过onSuccess
访问。当您调用这样的函数时,这就是全局对象(浏览器中的窗口)-这不是一件好事。您可能想创建一个构造函数,并将这些成员添加到其原型中,而不是将其全部放入全局。例如,在运行doWork()之后,您的全局对象将在您的函数外定义closureVar、someCall等。您知道,实际上不难停止这样的编码;)你就快到了,只需要读一下这些东西:例如。试试看,你会给自己一个惊喜的。@danp,我想我明白了。好链接。新代码是否更好?您需要真正锁定内部和外部变量的含义,但这是正确的路径。只需记住,onSuccess的值与您定义它时的值不同。您可以在ajax选项中设置上下文,也可以在其中设置$.proxy,或者向其传递绑定函数。。有很多方法可以解决这个问题。