首页 > 解决方案 > 使用 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 引擎中的代码吗?

标签: javascriptscopeinternalsscope-chain

解决方案


如果一个属性不是一个有效的标识符,它就不能像里面的标识符一样被引用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为什么我们可以引用undefinedandArray而不是window.undefinedand window.Array。这可能会导致错误...


推荐阅读