JS Scoping Issue - PullRequest
       23

JS Scoping Issue

2 голосов
/ 19 января 2012

Рассмотрим следующий фрагмент кода:

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 во втором операторе возврата - used out of scope..

Но почему? AFAIK, JavaScript имеет лексическую область видимости / функции. Поскольку нет вложенных функций, код должен быть совершенно корректным. Или я что-то упустил?

Ответы [ 3 ]

2 голосов
/ 19 января 2012

Одна переменная определяется с помощью var она видна всей функции.

То, что у вас есть, будет использовать level в окончательном возвращении, даже если оно никогда не было определено.

Я бы поставил

var level = 0;

... в верхней части функции и не объявлять ее в цикле for.

2 голосов
/ 19 января 2012

JSLint - это Lint, а не средство проверки простого синтаксиса.

Определение уровня функции - это то, к чему многие разработчики не привыкли и не ожидают. Автор JSLint считает целесообразным объявлять переменные таким образом, чтобы они по-прежнему были совместимы, если бы использовалась блокобзор

1 голос
/ 19 января 2012

Вероятно, это означает, что level не установлен, но используется для другого пути выполнения.

...