【问题标题】:Confusion about bind & call in JavaScript关于 JavaScript 中的绑定和调用的困惑
【发布时间】:2013-10-05 03:31:34
【问题描述】:

当我在 MDN 中阅读 Array.prototype.slice 时,我发现了一个例子:Array-like objects:

这里是示例代码:

var unboundSlice = Array.prototype.slice;
var boundSlice = Function.prototype.call.bind(unboundSlice);

function list() {
  return boundSlice(arguments, 0);
}

var list1 = list(1, 2, 3); // [1, 2, 3]

调用list(1, 2, 3)时的函数调用流程是什么?

  1. 我知道在list() 中,它调用boundSlice([1, 2, 3], 0)。但是boundSlice 发生了什么?
  2. 我知道boundSliceFunction.prototypecall() 函数的绑定函数,this 的值设置为Array.prototypeslice() 函数。
  3. slice()this,那么如何产生结果[1, 2, 3]?我猜最后的电话是[1, 2, 3].slice(0),对吗?如果我是对的,怎么会发生这种情况,谁能给我解释一下内部过程?

【问题讨论】:

  • 它基本上是在说Array.prototype.slice.call( [1, 2, 3] , 0 ); 来理解,你应该更多地研究'call'和'bind'

标签: javascript call bind slice


【解决方案1】:
var boundSlice = Function.prototype.call.bind(unboundSlice);

这基本上是:

var boundSlice = function (thisArg, arg1) {
    unboundSlice.call(thisArg, arg1);
};

棘手的部分是它如何知道在unboundSlice 上执行call 操作?这是因为call 方法在内部使用this 值来知道要调用哪个函数,并且由于我们使用...call.bind(unboundSlice)this 值设置为unboundSlice,它会调用此方法。

例如,当我们执行Array.prototype.slice.call(arguments, 0) 时,call 中的this 值将是Array.prototype.slice,因为this 值在未更改时始终是. 的左侧。

您对list(1, 2, 3) 成为[1, 2, 3].slice(0) 的结果的假设是正确的。

请注意,list 可以简单地实现为:

function list() {
    return Array.prototype.slice.call(arguments);
    //or return [].slice.call(arguments);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2014-06-06
    相关资源
    最近更新 更多