当使用 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 引擎中的代码吗?
当使用 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
语句创建一个对象 Environment Record一样,类似地,脚本中的所有代码在某种意义上都隐式地包装在with
全局对象的 a 中(导致全局环境记录)。
因此,出于完全相同的原因,当不能作为标识符的属性为 on 时window
,例如:
window['###'] = 'foo';
如果不首先明确引用(或使用其他方法来获取全局对象),就无法foo
通过使用独立标识符来实现。window
(当然,就像 with 一样,可以单独引用作为标识符的with
属性- 这就是window
为什么我们可以引用undefined
andArray
而不是window.undefined
and window.Array
。这可能会导致错误...)