JS范围问题

时间:2012-01-19 14:15:36

标签: javascript lexical-scope

考虑以下代码:

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检查时,它会抱怨第二个返回语句中的levelused out of scope.

但为什么呢? AFAIK,JavaScript具有词法范围/功能范围。由于没有嵌套函数,代码应该完全有效。或者我错过了什么?

3 个答案:

答案 0 :(得分:2)

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

即使从未定义过,您在最终报表中会使用level

我会把

var level = 0;

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

答案 1 :(得分:2)

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

功能级别范围是许多开发人员不习惯并且不期望的事情。 JSLint的作者认为以这样的方式声明变量是一种很好的方式,即如果使用块作用域,它们仍然是兼容的。

答案 2 :(得分:1)

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