使用JavaScript的with(){}语句时无效变量在哪里?

问题描述 投票:0回答:2

使用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 scope internals scope-chain
2个回答
1
投票

如果属性不是有效的标识符,则不能像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属性-这就是为什么我们可以引用undefinedArray而不是window.undefinedwindow.Array。可以cause bugs...


0
投票
变量[…]到哪里去?

我认为您对此很反感。 with语句不会创建任何变量(就像var声明一样),而是会更改

scope,以便将任何标识符视为对象的属性。每次访问xyz时,它看起来都是if ('xyz' in o) return o.xyz else …-这就是with语句如此缓慢且在严格模式下不推荐使用的原因。

因此根本就没有“变量名无效的变量”。如果首先使用无效的标识符,它将抛出语法错误,并且代码甚至无法运行。
© www.soinside.com 2019 - 2024. All rights reserved.