我知道call和apply方法的工作原理,但是要提这个问题,理解流程是有些棘手的事情。有人可以帮我理解这一点。
console.log.call.call.call.call.call.apply(a => a, [1, 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 => a
是function(a) { return a; }
的缩写arrow function。它创建一个匿名函数,该函数接受一个参数并返回相同的参数作为结果。请注意,此函数实际上并未引用this
,因此先前对.call
和.apply
的所有调用都几乎无关紧要。
最后一个[1, 2]
只是一个array文字,包含两个项目1
和2
,它们由.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将返回B
和A
作为单独的值,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])
尽管奇怪的是,我期望这种代码抛出一个错误,但不是,它只是没有记录日志或引发错误。所以它真的不返回任何东西...