Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中调用并应用_Javascript - Fatal编程技术网

在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
    来自您的算法@阿迪姆沙