这在代理陷阱中的值

Value of this inside a Proxy trap

提问人:Pavlo Zalutskiy 提问时间:5/11/2023 最后编辑:user3840170Pavlo Zalutskiy 更新时间:8/22/2023 访问量:70

问:

我有以下代码:

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")

为什么函数内部等于容器对象而不是容器对象? 对象在点之前,不是吗?thisapply{apply: f}this

这个 javascript-proxy

评论

0赞 Bergi 5/11/2023
因为是处理程序对象的方法吗?该函数及其参数作为参数传递。applysayHithis
1赞 Bergi 5/11/2023
您可能不应该在这里使用代理。只需返回一个简单的包装函数。

答:

1赞 VLAZ 5/11/2023 #1

因为这是规范所说的在使用代理时应该发生的情况:

10.5.12 [[调用]] ( ,thisArgumentargumentsList )

Proxy 外来对象的 [[Call]] 内部方法接受参数(ECMAScript 语言值)和(ECMAScript 语言值列表),并返回包含 ECMAScript 语言值的正常完成或突然完成。它在调用时执行以下步骤:OthisArgumentargumentsList

  1. 听任。[[ProxyHandler]]。handlerO
  2. 如果为 null,则引发 TypeError 异常。handler
  3. 断言:Type() 是 Object。handler
  4. 听任。[[ProxyTarget]]。targetO
  5. 听任?GetMethod(, “应用”)。traphandler
  6. 如果未定义,则
    a. 返回 ?调用(, , )。
    traptargetthisArgumentargumentsList
  7. 设为 CreateArrayFromList()。argArrayargumentsList
  8. 返回?调用(, , « , , »)。traphandlertargetthisArgumentargArray

或者简而言之,这里的相关内容是:

  1. 以代理处理程序对象为例,调用它。handler
  2. 从中获取方法,调用它。applyhandlertrap
  3. 用。其中本质上是需要与原始函数一起使用的参数列表。Call(handler, trap, args)argsCall

规范中的步骤 8. 中的调用正在执行一个函数,其中第一个参数是要执行的函数,第二个参数是 的值。this

由于 ECMAScript 规范规定第二个值应该是步骤 1 的 and。 设置为 [[ProxyHandler]],则观察到的行为与指定的行为一致。handlerhandler