提问人:Pavlo Zalutskiy 提问时间:5/11/2023 最后编辑:user3840170Pavlo Zalutskiy 更新时间:8/22/2023 访问量:70
这在代理陷阱中的值
Value of this inside a Proxy trap
问:
我有以下代码:
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
答:
1赞
VLAZ
5/11/2023
#1
因为这是规范所说的在使用代理时应该发生的情况:
10.5.12 [[调用]] ( ,
thisArgument
argumentsList
)Proxy 外来对象的 [[Call]] 内部方法接受参数(ECMAScript 语言值)和(ECMAScript 语言值列表),并返回包含 ECMAScript 语言值的正常完成或突然完成。它在调用时执行以下步骤:
O
thisArgument
argumentsList
- 听任。[[ProxyHandler]]。
handler
O
- 如果为 null,则引发 TypeError 异常。
handler
- 断言:Type() 是 Object。
handler
- 听任。[[ProxyTarget]]。
target
O
- 听任?GetMethod(, “应用”)。
trap
handler
- 如果未定义,则
a. 返回 ?调用(, , )。trap
target
thisArgument
argumentsList
- 设为 CreateArrayFromList()。
argArray
argumentsList
- 返回?调用(, , « , , »)。
trap
handler
target
thisArgument
argArray
或者简而言之,这里的相关内容是:
- 以代理处理程序对象为例,调用它。
handler
- 从中获取方法,调用它。
apply
handler
trap
- 用。其中本质上是需要与原始函数一起使用的参数列表。
Call(handler, trap, args)
args
Call
规范中的步骤 8. 中的调用
正在执行一个函数,其中第一个参数是要执行的函数,第二个参数是 的值。this
由于 ECMAScript 规范规定第二个值应该是步骤 1 的 and。 设置为 [[ProxyHandler]],则观察到的行为与指定的行为一致。handler
handler
上一个:使用此函数函数到不同的文件中
评论
apply
sayHi
this