我正在分解我找到的一些代码。 我被困在一个特定的问题上,并设法将其分解成更小的部分。 请记住,此代码是更大代码段的一部分。
function foo(string, num) {
console.log("calling foo ---", string, num);
}
以下位看起来应该可以工作。 我将我的两个参数传递到传递给 apply 的数组中。
但正如您从我添加的评论中看到的那样。num
参数为undefined
。string
参数在我传入的数组中具有第二个值,该值旨在成为 fornum
.
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 的代码的语句中,您可以看到它。
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
值(