gpt4 book ai didi

javascript - 为什么 call.call 调用函数

转载 作者:行者123 更新时间:2023-11-29 23:46:46 26 4
gpt4 key购买 nike

这里如果我有一个记录“调用我的函数”的函数

function myFunction() {
console.log('called my function')
}

Function.prototype.call.call(myFunction) // => "called my function"

在单个调用期间,例如:

function myFunction() {
console.log('called my function')
}
Function.prototype.call(myFunction)

最佳答案

当你写 someFunction.call(foo) 时,它的意思是调用 someFunction 同时将 foo 作为 this参数。通常你有 someObject.someFunction(),它将 someObject 作为 this 隐式传递,但是使用 .call 你可以将 this 设置为任何你想要的。参见 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call .

那么 Function.prototype.call(myFunction) 做了什么?嗯,它调用 Function.prototype,将 myFunction 作为 this 传递。调用 Function.prototype 有什么作用?根据 ECMA 规范:

The Function prototype object is itself a Function object (its [[Class]] is "Function") that, when invoked, accepts any arguments and returns undefined.

这就是为什么 Function.prototype.call(myFunction) 没有可见的效果。

另一方面,Function.prototype.call.call(myFunction) 调用 Function.prototype.call(它本身就是一个函数!),传递 myFunction 作为 this。这是做什么的?与 myFunction.call() 完全相同:当您查找函数对象的 call 属性时,您从 Function.prototype 中获取它无论如何(通过对象继承)。那么这是做什么的呢?它在没有(正常)参数的情况下调用 myFunction,但是它看到的 this 的值有点棘手:如果函数处于严格模式,this 将是 undefined;如果它是非严格的,this 将是全局对象(在浏览器中也称为 window)。

这也与您从 myFunction() 获得的行为相同(即不在对象上调用它)。换句话说,Function.prototype.call.call(foo) 只是一种(非常)迂回的写法 foo()

关于javascript - 为什么 call.call 调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43708620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com