使用JavaScript的with语句时,具有无效名称的变量会去哪里?
var o = {"@#$%":1,"test":2}
with(o){
console.log(test)
// Can't do this:
//console.log(@#$%)
// Was it not imported, or is it just inaccessible?
}
您也可以在JavaScript引擎中引用代码吗?
如果属性不是有效的标识符,则不能像with
中的标识符那样引用它。它不是不可访问的,但是您唯一的选择是像普通的一样手动在原始对象上查找属性:
var o = {"@#$%":1,"test":2}
with(o){
console.log(o['@#$%']);
}
这种问题并非不推荐使用的with
语句所独有。它也与全局对象一起发生。就像with
语句creates an object Environment Record一样,从某种意义上讲,脚本中的所有代码也隐式包装在全局对象的with
中(导致全局环境记录)。
因此,出于完全相同的原因,当不能为标识符的属性位于window
上时,例如:
window['###'] = 'foo';
[如果没有先明确引用foo
(或使用其他方法来获取全局对象),就无法使用独立标识符来获取window
。
(当然,就像with
一样,可以单独引用在window
上有效作为标识符的[[are属性-这就是为什么我们可以引用undefined
和Array
而不是window.undefined
和window.Array
。可以cause bugs...)
变量[…]到哪里去?
我认为您对此很反感。 with
语句不会创建任何变量(就像var
声明一样),而是会更改
scope,以便将任何标识符视为对象的属性。每次访问xyz
时,它看起来都是if ('xyz' in o) return o.xyz else …
-这就是with
语句如此缓慢且在严格模式下不推荐使用的原因。