链接适用于绑定.为什么我需要用 1 个额外的值填充我的数组?



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

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

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

但正如您从我添加的评论中看到的那样。num参数为undefinedstring参数在我传入的数组中具有第二个值,该值旨在成为 fornum.

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

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

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

谁能谈谈这里发生的事情? 如果我单独调用bindapply,则不需要数组填充。 似乎只有在组合它们时才需要它。

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

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

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 的代码的语句中,您可以看到它。

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

其中一些额外的位只是将参数数组状对象转换为数组。

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时,使用正确的调用上下文调用它 - 调用.bind时使用的this值是.bind如何知道要绑定哪个函数。(传递给.apply的第一个参数,就像.call一样,是要应用于的函数中使用的this值(

最新更新