javascript - a is a function, then what `a.call.call` really do? -


enter image description here

these codes run on chrome devtool.

it seems b.call(same a.call.call) calling first argument, function, pass second argument this. if first argument not function, throw not function error.

can explain how <function>.call.call work?

let me show example.

function a() { console.log(1) }  function b() { console.log(2) }  a.call(b)    // 1  a.call.call(b)    // 2  a.call.call.call(b)    // 2 

why?

we know a.call(b) means invoke a() this value b.

so a.call.call(b) means invoke function.prototype.call() this value b, same function.prototype.call.call(b).

but function.prototype.call.call() not ordinary function object. can invoked has no property. there's unique rules invoke it.

function.prototype.call.call(a)    // 1  function.prototype.call.call(b)    // 2 

in fact, function.prototype.call.call(b) exotic object, furthermore, bound function exotic object.

  • [specification] bound function exotic object wraps function object.

  • [specification] calling bound function results in call of wrapped function.

so function.prototype.call.call(a) means a().

a.call.call(x) means invoke x, is, x().

  • [specification] in function.prototype.call(thisarg), if thisarg undefined or null, replaced global object.

a.call.call() means a.call.call(undefined) means a.call.call(window) means invoke window.

try invoke window you'll uncaught typeerror: window not function, try invoke a.call.call() you'll uncaught typeerror: a.call.call not function.

hope helps.


Comments

Popular posts from this blog

sql - VB.NET Operand type clash: date is incompatible with int error -

SVG stroke-linecap doesn't work for circles in Firefox? -

python - TypeError: Scalar value for argument 'color' is not numeric in openCV -