在javascript中调用并应用
可能重复:在javascript中调用并应用,javascript,Javascript,可能重复: 我发现了一些类似这样的代码: function fun() { return Function.prototype.call.apply(Array.prototype.slice, arguments); } myarray, 0, 5 我知道js中的调用和应用,但是当它们结合在一起时,我感到困惑 那么我想知道 Function.prototype.call.apply(Array.prototype.slice, arguments) 同: Array.proto
我发现了一些类似这样的代码:
function fun() {
return Function.prototype.call.apply(Array.prototype.slice, arguments);
}
myarray, 0, 5
我知道js中的调用
和应用
,但是当它们结合在一起时,我感到困惑
那么我想知道
Function.prototype.call.apply(Array.prototype.slice, arguments)
同:
Array.prototype.slice.apply(arguments);
如果没有,第一行做什么?对于下一行,
.apply
正在调用.call
方法,调用上下文为。call
是.slice
方法,而arguments
集合作为单个参数传递
Function.prototype.call.apply(Array.prototype.slice, arguments);
这实际上给了我们:
Array.prototype.slice.call(arguments[0], arguments[1], arguments[2] /*, etc */);
这意味着调用.slice()
时,将使用arguments
对象中的第一项作为调用上下文,其余参数作为正常参数
Function.prototype.call.apply(Array.prototype.slice, arguments);
因此,如果参数的内容是这样的:
function fun() {
return Function.prototype.call.apply(Array.prototype.slice, arguments);
}
myarray, 0, 5
事实上,你的结局是:
myarray.slice(0, 5)
这基本上是一种不必这样做的方式:
var arr = arguments[0];
var rest = Array.prototype.slice(arguments, 1);
var result = arr.slice.apply(arr, rest);
好的,让我们通过替换来解决这个问题。我们从以下几点开始:
Function.prototype.call.apply(Array.prototype.slice, arguments);
我们知道:
Function.prototype.call
是一个函数
调用的指针指向函数.prototype
我们使用apply
将call
的指针更改为Array.prototype.slice
参数
应用于调用(未作为参数传递)
因此,上述声明相当于:
Array.prototype.slice.call(arguments[0], arguments[1], ...);
由此我们可以看到:
Array.prototype.slice
是一个函数
切片的指针指向数组.prototype
我们使用call
将切片的指针更改为参数[0]
参数[1],…
作为参数传递给切片
这与:
arguments[0].slice(arguments[1], ...);
function slice() {
return Function.prototype.call.apply(Array.prototype.slice, arguments);
}
这样做的好处是,我们在一行中创建了一个for切片
编辑:创建快速未绑定包装的更好方法如下所示(请注意,它可能在一些较旧的浏览器中不起作用,但您现在真的不需要担心这一点-您可以始终为不支持绑定的浏览器使用:
这与:
arguments[0].slice(arguments[1], ...);
function slice() {
return Function.prototype.call.apply(Array.prototype.slice, arguments);
}
工作原理:
Function.prototype.call
是一个函数
调用的指针指向函数.prototype
我们使用bind
将call
的指针更改为Array.prototype.slice
bind
返回其参数应用于调用的函数
奖励:如果您的编程风格像我的一样功能性很强,那么您会发现这段代码非常有用:
var funct = Function.prototype;
var obj = Object.prototype;
var arr = Array.prototype;
var bind = funct.bind;
var unbind = bind.bind(bind);
var call = unbind(funct.call);
var apply = unbind(funct.apply);
var classOf = call(obj.toString);
var ownPropertyOf = call(obj.hasOwnProperty);
var concatenate = call(arr.concat);
var arrayFrom = call(arr.slice);
使用此功能,您可以使用call
或apply
轻松创建未绑定的包装
您可以使用classOf
获取值的内部[[Class]]]
您可以将ownPropertyOf
inside用于in循环
您可以使用连接
来连接数组
您可以使用arrayFrom
创建数组
Function.prototype.bind.call(Function.prototype.bind,Function.prototype.bind)
:-)@Bergi-这与Function.prototype.bind.bind(Function.prototype.bind)
)这是真的吗Function.prototype.bind.bind(Function.prototype.bind)==Function.prototype.bind.bind
来自您的算法@阿迪姆沙