2

考虑以下代码:

function processParagraph(paragraph) {
    if (paragraph.charAt(0) === '%') {
        for (var level = 0; paragraph.charAt(level) === '%'; level++) {}

        return {
            type: 'h' + level,
            content: paragraph.slice(level + 1)
        };
    }

    return {
        type: 'p' + level,
        content: paragraph
    };
}

当我用 JSLint 检查这个时,它抱怨level在第二个 return 语句中是used out of scope..

但为什么?AFAIK,JavaScript 具有词法作用域/函数作用域。由于没有嵌套函数,代码应该是完全有效的。还是我错过了什么?

4

3 回答 3

2

一个变量是使用var它定义的,它对整个函数都是可见的。

level即使从未定义过,您在那里拥有的内容也将在最终返回中使用。

我会放

var level = 0;

...在函数的顶部,而不是在 for 循环中声明它。

于 2012-01-19T14:19:30.670 回答
2

JSLint 是一个 Lint,而不是一个普通的语法检查器。

函数级别的作用域是许多开发人员不习惯也没有预料到的事情。JSLint 的作者认为以这样一种方式声明变量是一种很好的风格,即如果使用块作用域,它们仍然是兼容的。

于 2012-01-19T14:28:04.567 回答
1

这可能意味着level未设置,但用于其他执行路径。

于 2012-01-19T14:18:59.113 回答