比严格模式还要严格?

4

我最近犯了一个很愚蠢的bug:

"use strict";

function doSomething() {
    let testObject = {a: "foo", b: "bar", parent: "bla"};

    if (parent in testObject) {
        console.log("has a parent")
    }
    else {
        console.log("does not have a parent")
    }
}

doSomething();

由于缺少对文字字面量parent的引号,解释器访问了window.parent,与当我写a in testObject时会出现的ReferenceError不同,并没有引发错误。 很明显,JavaScript无法知道我的意图不是访问window.parent,因此也就无法引发错误。但我想知道是否有一种调试模式,可以在这种情况下向控制台输出警告,例如:parent在此作用域中未定义,正在访问全局变量。

哇!那很棘手。 - Ahmad Alfy
2
我相信这可以作为一个 Linter 插件。一个应该在你这样做时警告你的插件。 - Ahmad Alfy
很好的发现。我看到JS Fiddle根据JSLint标记parent为未定义。 - Philipp Imhof
1
不要使用JSLint - 它是最古老的代码检查工具之一,这并不意味着它本身不好,但它对于那些并不重要的规则非常严格。在它之后出现的所有代码检查工具(如JSHint和ESLint)都是为了提供更多自由,让你可以自行决定哪些是错误,哪些不是。而不是像JSLint一样,把每个++操作都视为像引用全局变量一样糟糕的错误。 - VLAZ
2个回答

5

不,JavaScript没有“更严格”的模式来警告你。一些linter可能会(尽管TypeScript 会发现,就像这个示例window.parent 不是字符串或符号,所以作为 in 左侧表达式没有意义。当然,采用 TypeScript 是有成本的,但它确实有这样的好处。


1
RE ESLint: no-implicit-globals规则可以捕获它。虽然我不知道为什么它不是推荐的规则集的一部分。 - VLAZ
@VLAZ - 当我启用该选项时,似乎在演示页面上并没有显示出来。(它抱怨该函数位于全局范围内,但没有关于parent in的抱怨。) - T.J. Crowder
啊,我明白了。在这种情况下,是因为变量名是 parent,所以在浏览器环境的配置中,它被视为有效变量,因为有 window.parent - VLAZ

0

不,没有比严格模式更严格的东西了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接