【发布时间】:2018-08-21 22:11:54
【问题描述】:
谁能解释一下下面的输出
var handler = {
get: function(target,key, receiver){
return new Proxy(Reflect.get(target, key, receiver),handler);
},
apply: function(target, thisArg, args){
Reflect.apply(target, thisArg, args);
}
}
var p = new Proxy(window, handler);
p.alert("Alert"); // Throws illegal invocation error
var alias = p.alert;
alias("Alert") // Even this works which is baffling for me
var p = new Proxy(Reflect.get(window, "alert"), handler);
p("Alert"); // works as expected
第一条语句抛出非法调用错误,而第二条则没有。他们两个看起来和我一模一样,我不明白第一个语句在Reflect.apply 期间没有所需的this 上下文
【问题讨论】:
-
对于@ibrahimmahrir 的答案,因为它适用于您的代理,请参阅
alert.call(new Proxy(window, {}), "alert")产生的错误 -
在没有明确上下文的情况下调用函数时,上下文将为
window。显式上下文:在obj.func和func.call(obj)中,上下文将为obj。 -
@Ry- 感谢这个精彩的例子,它实际上回答了这个问题。所以将目标的代理对象作为上下文传递与将目标本身作为上下文传递是不一样的,这实际上是有道理的。
标签: javascript javascript-objects es6-proxy