我有以下代码
function delay(f, ms) {
return new Proxy(f, {
apply(target, thisArg, args) {
console.log(this)
console.log(thisArg)
setTimeout(() => f.apply(thisArg, args), ms)
}
})
}
function sayHi(user) {
alert(`Hello, ${user}!`);
}
sayHi = delay(sayHi, 3000);
let container = {
f: sayHi
}
container.f("Paul")
为什么apply函数中的 this 等于{apply:f},而不是容器对象。This 是dot之前的对象,对吗?
1条答案
按热度按时间cgh8pdjw1#
因为这就是规范中所说的在使用代理时应该发生的情况:
10.5.12 调用(
thisArgument
,argumentsList
)Proxy exotic对象
O
的Call内部方法接受参数thisArgument
(ECMAScript语言值)和argumentsList
(ECMAScript语言值列表),并返回包含ECMAScript语言值的正常完成或突然完成。调用时执行以下步骤:1.设
handler
为O
.ProxyHandler。1.如果
handler
为null,抛出TypeError异常。1.类型(
handler
)是Object。1.设
target
为O
.ProxyTarget。1.设
trap
为?GetMethod(handler
,“apply”)。1.如果
trap
是undefined,则a.返回?调用(
target
,thisArgument
,argumentsList
)。1.设
argArray
为CreateArrayFromList(argumentsList
)。1.返回?调用(
trap
,handler
,«target
,thisArgument
,argArray
»)。简而言之,这里的相关内容是:
1.获取代理处理程序对象,将其命名为
handler
。1.从
handler
中取出apply
方法,称之为trap
。1.使用
Call(handler, trap, args)
。其中args
本质上是在原始函数中使用Call
所需的参数列表。步骤8中的
Call
。在规范中是执行一个函数,其中first参数是要执行的函数,second是this
的值。由于ECMAScript规范规定第二个值应该是
handler
,因此在步骤1。handler
被设置为ProxyHandler,那么观察到的行为与指定的行为福尔斯。