想了解console.log.call.call.call.call.call.apply(a => a,[1,2])的代码流;

时间:2019-04-26 17:19:30

标签: javascript

我知道callapply方法的工作原理,但是要提这个问题,理解流程是有些棘手的事情。有人可以帮我理解这一点。

console.log.call.call.call.call.call.apply(a => a, [1, 2]);

2 个答案:

答案 0 :(得分:6)

首先,请注意,在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除了最后一个实际上都不重要。代码的最初部分只是尝试在 some 函数上应用.call,并且可以很容易地用Function.prototype.call.apply

替换

略微向前跳a => afunction(a) { return a; }的缩写arrow function。它创建一个匿名函数,该函数接受一个参数并返回相同的参数作为结果。请注意,此函数实际上并未引用this,因此先前对.call.apply的所有调用都几乎无关紧要。

最后一个[1, 2]只是一个array文字,包含两个项目12,它们由.apply作为参数展开。

因此将其分解:

console.log.call.call.call.call.call.apply(a => a, [1, 2]);

可以简化为:

Function.prototype.call.apply(a => a, [1, 2]);

可以简化为:

var fn = a => a;
fn.call(1, 2);

.call将其第一个参数用作函数的this值,并将后续值用作参数,并且由于fn不使用this,因此我们可以进一步简化为:

var fn = a => a;
fn(2);

由于fn只是一个简单的标识函数,结果就是:

2;

答案 1 :(得分:-1)

它什么都不做,apply将返回BA作为单独的值,DELETE FROM A a WHERE $1 IS NULL OR a.name IN ( SELECT a.name FROM A a, B b WHERE b.name = $1 AND a.id = b.id ) 不会做任何事,因为它不是函数。即使您要做1,也不会得到任何结果,因为第一个调用仅返回数组2,而第二个call不能执行任何操作……

console.log.call.call(a => a, [1,2])

尽管奇怪的是,我期望这种代码抛出一个错误,但不是,它只是没有记录日志或引发错误。所以它真的不返回任何东西...