首页 > 解决方案 > 链接适用于绑定。为什么我需要用 1 个额外值填充我的数组?

问题描述

我正在分解我找到的一些代码。我被困在一个特定的问题上,并设法把它分解成一个更小的部分。请记住,这段代码是一段更大的代码的一部分。

function foo(string, num) {
    console.log("calling foo ---", string, num);
}

以下位看起来应该可以工作。我将我的两个参数传递到传递给 apply 的数组中。

但正如您从我添加的评论中看到的那样。num参数undefined为。并且该string参数具有我传入的数组中的第二个值,该值原本是 for num

foo.bind.apply(foo, ["fdsf", 432])(); // calling foo --- 432 undefined

但是如果我在数组的开头添加一个附加值(它可以是任何东西),那么一切都会顺利进行。

foo.bind.apply(foo, [0, "fdsf", 432])(); // calling foo --- fdsf 432

谁能解释一下这里发生了什么?如果我单独调用bind或调用apply,则不需要数组填充。只有在组合它们时才需要它。

为什么需要数组开头的附加值?

另外,这里是原始代码供参考。它来自凯尔辛普森的一本书。

function asyncify(fn) {
    var orig_fn = fn,
        intv = setTimeout( function(){
            intv = null;
            if (fn) fn();
        }, 0 );

    fn = null;

    return function() {
        if (intv) {
            fn = orig_fn.bind.apply(orig_fn, [this].concat([].slice.call(arguments)));
        } else {
            orig_fn.apply( this, arguments );
        }
    };
}

这里还有很多事情要做。但是在if关于 2/3 的语句中,虽然是代码,但你可以看到它。

apply 的第二个参数是数组,第一个值(填充)是global对象(我假设它是全局对象,它不重要,它可以是任何东西)。后跟任何传入的参数。

其中一些额外的部分只是将参数类数组对象转换为数组。

标签: javascriptasynchronousthisapplybind

解决方案


bind接受的第一个参数是this要在函数内部使用的值。所以,如果你使用

fn.bind.apply(fn, arr)

的第一项arr成为 bind 的第一个参数,例如,它等价于:

fn.bind(arr[0], arr[1], arr[2] /* ... */ )

所以数组的第一项成为this值,数组的第二项成为第一个参数,数组的第三项成为第二个参数,依此类推。

this下面是一个活生生的例子,说明当函数被调用时,如何在开始时用一个值“填充”数组成为新值:

const obj = { prop: 'val' };

function foo(string, num) {
    console.log("calling foo ---", string, num);
    console.log('this:', this);
}

const fn = foo.bind.apply(foo, [obj, 'str', 55]);
fn();

至于重复性

foo.bind.apply(foo, ...

调用时需要重复函数名,apply以便在调用时bind使用正确的调用上下文调用它 - 调用this时使用的值.bind是如何.bind知道要绑定哪个函数。(传递给 的第一个参数.apply,就像 一样.call,是this要在正在应用的函数中使用的值)


推荐阅读