代理陷阱内的 this 值

问题描述 投票:0回答:1

我有以下代码:

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

为什么

this
函数中的
apply
等于
{apply: f}
而不是容器对象?
this
是点之前的对象,不是吗?

javascript this javascript-proxy
1个回答
1
投票

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

10.5.12 [[通话]] (
thisArgument
,
argumentsList
)

代理外来对象的 [[Call]] 内部方法

O
接受参数
thisArgument
(ECMAScript 语言值)和
argumentsList
(ECMAScript 语言值列表),并返回包含 ECMAScript 语言的正常完成值或突然完成。调用时它会执行以下步骤:

  1. handler
    O
    。[[ProxyHandler]]。
  2. 如果
    handler
    null,则抛出 TypeError 异常。
  3. 断言:类型(
    handler
    )是对象。
  4. target
    O
    。[[ProxyTarget]]。
  5. trap
    成为? GetMethod(
    handler
    , "应用").
  6. 如果
    trap
    未定义,则
    A。返回 ?致电(
    target
    thisArgument
    argumentsList
    )。
  7. argArray
    为 CreateArrayFromList(
    argumentsList
    )。
  8. 返回?致电(
    trap
    ,
    handler
    , «
    target
    ,
    thisArgument
    ,
    argArray
    »).

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

  1. 获取代理处理程序对象,将其称为
    handler
  2. apply
    中获取
    handler
    方法,将其命名为
    trap
  3. 使用
    Call(handler, trap, args)
    。其中
    args
    实质上是与原始函数一起使用
    Call
    所需的参数列表。

规范中第 8 步中的

Call
正在执行一个函数,其中 first 参数是要执行的函数,secondthis
 的值。

由于 ECMAScript 规范规定第二个值应该是

handler

 并且在步骤 1. 
handler
 设置为 [[ProxyHandler]],那么观察到的行为与指定的行为一致。

© www.soinside.com 2019 - 2024. All rights reserved.