是否可以在没有with(global)
默认情况下所有脚本似乎都具有的隐式上下文的情况下执行代码块?例如,在浏览器中,是否有任何方法可以设置脚本,以便像这样的行
const foo = location;
投掷
未捕获的 ReferenceError:未定义位置
而不是访问window.location
,何时location
尚未首先声明?缺少这一点,有没有办法使这种隐式引用可能导致某种警告?在编写代码时,它可能是错误的来源(见下文),因此有一种防范它的方法可能很有用。
(当然,由于普通的作用域规则,可以使用const
orlet
或在内部块中声明另一个同名变量,以确保使用该变量名引用新变量而不是全局属性,但这不是一样。)
这可能类似于询问是否可以停止从实际 with
语句中引用属性:
const obj = { prop: 'prop' };
with (obj) {
// how to make referencing "prop" from somewhere within this block throw a ReferenceError
}
众所周知,一开始with
不应该使用 ,但不幸的是,当谈到 时,我们似乎别无选择with(global)
,它偶尔会节省一些字符,但代价是会经常弹出一些令人困惑的错误:1 2 3 4 5 6 . 例如:
var status = false;
if (status) {
console.log('status is actually truthy!');
}
(这里的问题:window.status
是一个保留属性 - 分配给时,它将分配的表达式强制为字符串)
这些类型的错误与with
不鼓励或禁止显式使用的原因相同,但隐式with(global)
继续导致问题,即使在严格模式下,因此找出解决方法将很有用。