javascript - 链接适用于绑定。为什么我需要用 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
对象(我假设它是全局对象,它不重要,它可以是任何东西)。后跟任何传入的参数。
其中一些额外的部分只是将参数类数组对象转换为数组。
解决方案
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
要在正在应用的函数中使用的值)
推荐阅读
- java - 如何使用 java 在 Internet 上创建、访问和编辑 csv 文档
- java - 为什么只有少量的Java库里面包含module-info.class?
- javascript - node.bcrypt.js,错误:“未定义未给出回调函数”
- java - Java - Flink -> 过滤元组列表的最快方法
- python - Python Tkinter 线程在 Windows 10 上无法按预期工作
- c# - C# GetAllUsers() 项目已被添加。输入字典错误
- java - 如何从过滤的 jtable 中选择并显示右行?
- linux - 如何创建 ALSA 虚拟设备以将音频传送到命令?
- java - 如何在 BasicThreadFactory 中使用名称模式?
- vue.js - 固定位置 Vuetify 警报组件