关于如何将函数的arguments转换为真正的数组,有很多解释。
但是,当您在bind的帮助下简化代码时,我发现非常有趣。
MDN Array.prototype.slice类数组对象
MDN Function.prototype.bind -创建快捷方式
例如:
function list() {
return Array.prototype.slice.call(arguments);
}
var list1 = list(1, 2, 3); // [1, 2, 3]简化呼叫:
var unboundSlice = Array.prototype.slice;
var slice = Function.prototype.call.bind(unboundSlice);
function list() {
return slice(arguments);
}
var list1 = list(1, 2, 3); // [1, 2, 3]如果您使用apply而不是call,它的工作方式是相同的。
var slice = Function.prototype.apply.bind(unboundSlice);使用来自任何函数实例的call甚至可以缩短它,因为它与原型中的相同,与来自数组实例的slice的方法相同:
var slice = alert.call.bind([].slice);你可以试试
var slice = alert.call.bind([].slice);
function list() {
console.log(slice(arguments));
}
list(1, 2, 3, 4);
因此,我脑海中出现的第一个非常奇怪的事情是在apply上调用apply,但是bind的第一个参数应该是对象(作为上下文),而不是函数(Array.prototype.slice)。
另一种方法是以同样的方式处理call和apply。
我写了很长一段时间的javascript,每天都很自信地使用这些方法,但是我不能把我的头绕在这上面。
也许我遗漏了一些非常基本的细节。
有人能解释一下吗?
发布于 2016-07-07 15:40:39
bind的第一个参数应该是一个对象(作为上下文)
是。
而不是函数(
Array.prototype.slice)。
为什么不行?首先,所有函数都是对象,所以这里没有什么问题。
从另一个角度来看,如果使用slice.call(…)或slice.apply(…),那么slice对象就是call/apply方法调用的上下文(接收者)。
绑定
apply和call有什么区别?
applyBoundToSlice(arguments)和callBoundToSlice(arguments)之间没有差异。如果您希望将开始参数和结束参数传递给applyBoundToSlice(arguments, [0, n]),则callBoundToSlice(arguments, 0, n)与slice之间的区别是。
发布于 2019-07-16 16:37:48
可以使用call关键字实现方法借用。下面的例子显示了方法的借用。
var john = {
name: "John",
age: 30,
isAdult: function() {
console.log(this.name+"'s age is "+this.age);
if (this.age > 18) {
return true;
} else {
return false;
}
}
}
console.log(john.isAdult());
var rita = {
name: "Rita",
age: 15
}
console.log(john.isAdult.call(rita));注意最后一行。如何使用关键字调用和如何将rita对象传递给函数。
https://stackoverflow.com/questions/38246313
复制相似问题