javascript 代理内this的值

rlcwz9us  于 2023-05-12  发布在  Java
关注(0)|答案(1)|浏览(140)

我有以下代码

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之前的对象,对吗?

cgh8pdjw

cgh8pdjw1#

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

10.5.12 调用thisArgumentargumentsList

Proxy exotic对象OCall内部方法接受参数thisArgument(ECMAScript语言值)和argumentsList(ECMAScript语言值列表),并返回包含ECMAScript语言值的正常完成或突然完成。调用时执行以下步骤:
1.设handlerO .ProxyHandler
1.如果handlernull,抛出TypeError异常。
1.类型(handler)是Object。
1.设targetO .ProxyTarget
1.设trap为?GetMethod(handler,“apply”)。
1.如果trapundefined,则
a.返回?调用(targetthisArgumentargumentsList)。
1.设argArray为CreateArrayFromList(argumentsList)。
1.返回?调用(traphandler,« targetthisArgumentargArray »)。
简而言之,这里的相关内容是:
1.获取代理处理程序对象,将其命名为handler
1.从handler中取出apply方法,称之为trap
1.使用Call(handler, trap, args)。其中args本质上是在原始函数中使用Call所需的参数列表。
步骤8中的Call。在规范中是执行一个函数,其中first参数是要执行的函数,secondthis的值。
由于ECMAScript规范规定第二个值应该是handler,因此在步骤1。handler被设置为ProxyHandler,那么观察到的行为与指定的行为福尔斯。

相关问题