2012-01-19 5 views
2

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

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 имеет лексический охват/область действия. Поскольку нет вложенных функций, код должен быть абсолютно корректным. Или я чего-то не хватает?

+1

Какова ценность «уровня», если параметр paragraph.charAt (0) не равен «%»? Поскольку первая декларация «уровня» находится внутри оператора if, она может жаловаться на возможное использование неизменной переменной. – adelphus

+0

Вы уверены, что JSLint жалуется на эту переменную? Этот код правильный. Кстати, было бы лучше объявить переменную при начале функции, потому что этот код довольно трудно прочитать. –

ответ

2

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

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

Я бы поставил

var level = 0; 

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

1

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

2

JSLint - это Lint, а не простой синтаксический анализатор.

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

 Смежные вопросы

  • Нет связанных вопросов^_^