我知道调用和应用方法的工作原理,但是要问这个问题,让我理解流程有些棘手。有人可以帮我理解这一点。
console.log.call.call.call.call.call.apply(a => a, [1, 2]);Run Code Online (Sandbox Code Playgroud)
首先,请注意,在JavaScript中,函数是对象,并且可以具有自己的属性(您可以.像其他任何对象一样使用符号访问属性)。存在于所有函数上的属性是.apply和.call,它们本身就是函数。
第二,两者.call并.apply提供一种机制来调用一个函数与一个指定的this值。要理解的是,this通常指的是无论是对的左手侧.,当你调用一个函数作为对象的方法,例如,当你调用foo.bar(1, 2, 3)的范围内bar,this将引用foo。因此也可以使用bar.call(foo, 1, 2, 3)或bar.apply(foo, [1, 2, 3])达到类似的效果。在这两种情况下,第一个参数都变为this。
因此,基本上来说,除了最后一个之外的console.log和,.call实际上并不重要。代码的开始部分是刚刚尝试应用.call上的一些功能,并可以很容易地被替换Function.prototype.call.apply
略微向前跳a => a是箭头功能,简称function(a) { return a; }。它创建一个匿名函数,该函数接受一个参数并返回相同的参数作为结果。请注意,这个功能实际上并不指this因此之前的所有通话.call和.apply是几乎不相关。
最后[1, 2]一个只是包含两个项目的数组文字,1并且2由展开为参数.apply。
因此分解:
console.log.call.call.call.call.call.apply(a => a, [1, 2]);
Run Code Online (Sandbox Code Playgroud)
可以简化为:
Function.prototype.call.apply(a => a, [1, 2]);
Run Code Online (Sandbox Code Playgroud)
可以简化为:
var fn = a => a;
fn.call(1, 2);
Run Code Online (Sandbox Code Playgroud)
.call将使用其第一个参数作为this函数的值,并将后续值作为参数传递,并且由于fn不使用this,我们可以进一步将其减小为:
var fn = a => a;
fn(2);
Run Code Online (Sandbox Code Playgroud)
由于fn这只是一个简单的标识函数,因此结果如下:
2;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |