2015-07-01 4 views
8

, поэтому у меня есть предупреждение в моем компиляторе JS, но не могли бы вы объяснить мне, повлияет ли это на способ моего кода?JS Mutable Variable доступна из-за закрытия

for (x = 0; x < levels.length; x++) { 
    var level = levels[x]; 
    var candlesOnLevel = $.grep(relevantCandles, function(candles, index) { 
     return parseInt($(candles).css("top").replace(/px/, "")) === level; 
    }); 
} 
+1

Какое предупреждение вы получаете? – Tushar

+1

Ваш код в порядке. Компилятор предполагает, что обратный вызов, переданный в '$ .grep', является асинхронным, но это не так. – CodingIntrigue

+0

Предупреждение - это просто «Переменная переменная доступна из-за закрытия», за что ответит! –

ответ

4

Он предупреждает, что level может быть изменен до того, что Grep «обратный вызов» получает к ней - конечно, IDE не знает, что $.grep не принимает функцию обратного вызова, а функция фильтра. (Обратите внимание, что функции асинхронных принимая обратный вызов, как правило, имеет такую ​​же подпись)

Если были асинхронной функция обратного вызова, то при чтении значения level было бы найти значение последнего набор там - в последней итерации петли петли, а не значение, присутствующее при отправке вызова, что вызовет проблемы - следовательно, (заметьте, как правило, очень полезно) предупреждение.

+0

Пожелайте, чтобы вы коснулись того, как правильно передать значение в асинхронный обратный вызов. – IronSean

5

Почему вы получаете предупреждение

Как @RGraham упоминалось в комментариях JS компилятор предполагает, что второй параметр $.grep() является функцией обратного вызова и выполняется асинхронно (по крайней мере, это то, что это выглядит синтаксически). Однако это неверно, потому что вторая функция фактически является функцией фильтра . См API docs

Один обычно получает предупреждение Mutable Variable is accessible from closure при использовании async функции внутри для цикла. То потому что весь for loop имеет одну область. Это означает, что на каждой итерации вы должны получить одну и ту же переменную. Таким образом, обратный вызов получит неправильные идентификаторы, потому что level (будучи изменяемым) будет изменен до вызова обратного вызова. К счастью, это еще не так, вы имеете дело с (потому что $ .grep не асинхронные) :)

... могли бы вы объяснить мне, если это будет на самом деле влияет на способ моего код будет выполнять?

Нет, такое предупреждение не повлияет на результат вашего кода.

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

for (x = 0; x < levels.length; x++) { 
    (function(){ 
     var level = levels[x]; 
     var candlesOnLevel = $.grep(relevantCandles, function(candles, index) { 
      return parseInt($(candles).css("top").replace(/px/, "")) === level; 
     }); 
    })(); 
} 
Смежные вопросы