javascript - 使用 JavaScript 的 with(){} 语句时,无效变量会去哪里?
问题描述
当使用 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
。这可能会导致错误...)
推荐阅读
- r - 如何将emmeans对比p值添加到ggplot?
- javascript - 对象数组没有更新和属性没有被读取
- python - Keras CNN 总是预测同一类
- c++ - 我可以做些什么来删除或最小化提供相同功能和行为的代码重复?
- r - 查找语料库中单个文档的特定单词的频率 - R、TermDocumentMatrix、TM
- java - 有没有更好的方法来编写这段代码?(在数组中查找最小数和最大数)[Java]
- kotlin - 在不使用正则表达式的情况下有效地将 Kotlin 字符串分解为固定长度的子字符串
- amazon-web-services - 通过 AWS Glue 执行 Redshift 过程
- php - Prestahop 1.7.6 如何删除/禁用产品页面?
- c++ - 如何通知服务驱动程序卸载?