2015-09-30 2 views
3

Следующий фрагмент кода печатает «K» 16 раз.Понимать область JavaScript в пределах цикла

var rest = "KLMNOPQRSTUVWXYZ".split(""), fns = {}; 
for (var i=0; i<rest.length; i++) { 
    (function(i){ 
     fns[rest[i]] = function() { 
      console.log(rest[i]); 
     }; 
     fns.K(); 
    })(i); 
} 

Этот фрагмент кода выводит все алфавиты "К", "L" ....... "Y", "Z"

var rest = "KLMNOPQRSTUVWXYZ".split(""), fns = {}; 
for (var i=0; i<rest.length; i++) { 
    fns[rest[i]] = function() { 
     console.log(rest[i]); 
    }; 
    fns.K(); 
} 

Я новичок в JavaScript, и не совсем понимают, как использование IIFE во втором примере приводит к разному поведению. Может кто-то прояснить?

ответ

2
var rest = "KLMNOPQRSTUVWXYZ".split(""), fns = {}; 
for (var i=0; i<rest.length; i++) { 
    (function(i){ 
     //the i inside this function is private, it is not the same i from outside, 
     //Any modification to the i from the loop won't affect this one. 
     fns[rest[i]] = function() { 
      console.log(rest[i]); 
     }; 
     fns.K(); 
     // fns[rest[i]](); You should use this if for printing the correct letter 
    })(i); 
} 

Нет IIFE

var rest = "KLMNOPQRSTUVWXYZ".split(""), fns = {}; 
for (var i=0; i<rest.length; i++) { 
    fns[rest[i]] = function() { //You declare a function for each letter 
     console.log(rest[i]); //This i contains always the current iteration from the loop 
    }; 
    fns.K(); //calls the first function defined, "K" that prints the current iteration 
} 
1

вопрос вы спросили на самом деле проясняет тему область видимости функции в JavaScript. Это не имеет никакого отношения к циклам.

Хотя JavaScript использует синтаксис блока, область действия определяется функциями. В этом случае существуют две переменные i. Один из них находится внутри функции, а другой - вне его.

var rest = "KLMNOPQRSTUVWXYZ".split(""), fns = {}; 
for (var i=0; i<rest.length; i++) { 
    (function(i){ 
     //the i inside this function is private because of function scope 
     fns[rest[i]] = function() { 
      console.log(rest[i]); 
     }; 
     fns.K(); 
    })(i); 
} 
1

В первом случае IIFE создаст локальную область на каждой итерации. i решила, что i было передано в IIFE. Следовательно, вызов fns.K() всегда будет устранен до rest[0].

Во втором случае i привязан к петле i. Вызов fns.K() будет вести журнал rest[i], где i - текущее значение i.

+0

Когда функция определена, rest [i] фактически не оценивается. Он оценивается во время выполнения функции. И затем он извлекает i из области частной функции, если таковой есть? Я прав? – user2383728

+0

@ user2383728 Да. В первом случае «i» встречается сначала в области IIFE. Второй случай, это цикл 'i'. – Joseph

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