Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在不嵌套的情况下分配回调参数_Javascript - Fatal编程技术网

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)));
    }
}
你说的是咖喱。实际上,您可以使用ES5s
Function.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。实际上,您可以使用ES5s
Function.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没有一个简单的方法可以避免使用额外的函数包装器。谢谢,这看起来更整洁了。。。即使在幕后,它仍在进行两次函数调用。