繁体   English   中英

Javascript代理和With语句

[英]Javascript Proxies and With statements

为什么这会引发ReferenceError?

var p = new Proxy({}, {
    get: function(target, name) {
        return `hello world ${name}`;
    }
});
with (p) { console.log(a) }

未捕获的ReferenceError:未定义

我认为with可能会读取p对象的现有属性,并将它们添加到变量范围。 因此,由于没有实际a属性,因此不会将其添加到范围中。

换句话说,此时a查找将调用变量解析,而从不调用属性解析。

13.11有陈述

with语句将已计算对象的对象环境记录添加到正在运行的执行上下文的词法环境中。 然后,它使用此扩充词法环境执行一条语句。 最后,它还原了原始词汇环境。

然后,在可变分辨率下,它执行hasBinding(name) ,该代理对象将失败,因为没有绑定。

8.1.1环境记录

HasBinding(N)确定环境记录是否具有字符串值N的绑定。如果有,则返回true,否则返回false。

这段代码很愚蠢。 但是,它提出的问题非常有趣。 事实证明,您可以使它起作用! 您需要一种使用代理上的has方法来告诉javascript对象中可用变量的方法。 此外,由于某些原因,符号不能隐式转换为字符串。 因此,为了使此代码“ 起作用 ”,您需要类似以下内容。

var p = new Proxy({}, {
    //we need to identify what elements are available. 
    //this overloads the in operator eg ("foo" in obj)
    has:function(target,name){
        //if we just returned true we would override everything
        //and we need to get to the console
        return name!="console";
    },      
    get: function(target, name) {
        //for some reason the toString is mandatory don't know why 
        //you get "TypeError: Cannot convert a Symbol value to a string" otherwise
        return "Hello world "+name.toString();
    }
});
with (p) { console.log(abc) } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM