Javascript 如何在不嵌套的情况下分配回调参数
我喜欢在私有名称空间中编写回调函数,然后通过引用调用它们。乙二醇Javascript 如何在不嵌套的情况下分配回调参数,javascript,Javascript,我喜欢在私有名称空间中编写回调函数,然后通过引用调用它们。乙二醇 var myCallback = function() { }; // ... somewhere else in the class. SomeOtherObject.doSomething(myCallback); 这使得代码更整洁,更易于扩展。但是,当我需要从原始函数向回调传递任何参数时,它会变得混乱,我必须将回调引用包含在闭包中。乙二醇 var myCallback = function(a_var, another
var myCallback = function() {
};
// ... somewhere else in the class.
SomeOtherObject.doSomething(myCallback);
这使得代码更整洁,更易于扩展。但是,当我需要从原始函数向回调传递任何参数时,它会变得混乱,我必须将回调引用包含在闭包中。乙二醇
var myCallback = function(a_var, another_var) {
};
// ... somewhere else in the class.
a_var = "something";
SomeOtherObject.doSomething(function(another_var) {
myCallback(a_var, another_var);
};
这导致回调需要两个函数调用,而不是一个,从而产生开销。这还意味着我有一个用于闭包的未记录匿名函数,或者我记录了这两个函数。(与其说是缺少函数定义,不如说是缺少参数定义。)如果回调像好函数一样小,那么它就不值得把它放在私有范围内
最好的方法是什么?部分应用程序实现允许您以这种方式传递变量 例如,使用本机:
调用时,另一个\u var
将传递给该函数
但它并不是到处都支持,所以您可以使用它来代替。部分应用程序实现允许您以这种方式传递变量 例如,使用本机:
调用时,另一个\u var
将传递给该函数
不过,并不是所有地方都支持它,所以您可以使用它来代替。您可以使用函数currying
Function.prototype.curry = function() {
if (arguments.length<1) {
return this;
}
var __method = this;
var slice = [].slice;
var args = slice.call(arguments);
return function() {
return __method.apply(this, args.concat(slice.call(arguments)));
}
}
你可以做函数咖喱
Function.prototype.curry = function() {
if (arguments.length<1) {
return this;
}
var __method = this;
var slice = [].slice;
var args = slice.call(arguments);
return function() {
return __method.apply(this, args.concat(slice.call(arguments)));
}
}
你说的是咖喱。实际上,您可以使用ES5sFunction.prototype.bind
来完成以下任务:
var myCallback = function(a_var, another_var) {
};
SomeOtherObject.doSomething(myCallback.bind(null, a_var, another_var);
这里发生的事情是,.bind()
获取参数并创建一个新函数并返回它,以及新的范围和变量。任何其他可能传递到doSomething
的参数都将出现在绑定列表的末尾
使用.bind()
的注意事项是性能。由于某种原因(我到目前为止还没有想到),它的速度慢得令人讨厌。这在应用程序中并不重要,因为我们仍然在讨论每秒几十万次的操作,但与普通函数相比,绑定函数调用的速度会降低60-90%。您所说的是curry'ing。实际上,您可以使用ES5sFunction.prototype.bind
来完成以下任务:
var myCallback = function(a_var, another_var) {
};
SomeOtherObject.doSomething(myCallback.bind(null, a_var, another_var);
这里发生的事情是,.bind()
获取参数并创建一个新函数并返回它,以及新的范围和变量。任何其他可能传递到doSomething
的参数都将出现在绑定列表的末尾
使用
.bind()
的注意事项是性能。由于某种原因(我到目前为止还没有想到),它的速度慢得令人讨厌。这在应用程序中并不重要,因为我们仍然在讨论每秒几十万次的操作,但与普通函数相比,绑定函数调用的速度会降低60-90%。AFAIK,这实际上是部分应用程序的情况。Curry是一种特定类型的局部应用程序,其中单个参数传递给生成的函数。请参阅填充函数的前两个参数(并返回新函数)通常称为currying。“速度降低了约60-90%”。这比两个普通嵌套函数调用生成的50%要好。AFAIK,这实际上是部分应用程序的情况。Curry是一种特定类型的局部应用程序,其中单个参数传递给生成的函数。请参阅,填充函数的前两个参数(并返回一个新函数)通常被称为currying。“慢了大约60-90%。”这比两个普通嵌套函数调用将生成的50%要好。在执行时,另一个变量不会是未定义的。
?@xdazz,噢,你说得对。我认为OP没有一个简单的方法可以避免使用额外的函数包装器。谢谢,这看起来更整洁了。。。即使在幕后,它仍在进行两次函数调用。在执行.bind
时,另一个_var
不会是未定义的吗?@xdazz,哦,你是对的。我认为OP没有一个简单的方法可以避免使用额外的函数包装器。谢谢,这看起来更整洁了。。。即使在幕后,它仍在进行两次函数调用。