2013-05-28 4 views
1

Это академический вопрос, касающийся javascript.Область указателя функции JavaScript

Сегмент кода ниже принимает массив целых чисел и возвращает массив указателей на функции. Функции, на которые указывает, должны возвращать квадрат значения массива.

Если вход был listOfFunction = sqFnList ([1,2,3,4,5])

Затем listOfFunction[0]() должен возвращать 1

и listOfFunction[1]() должен возвращать 4

, но это не делает ,

function sqFnList(a){ 
    var b = []; 
    for (var i = 0; i <a.length; i++) 
    { 
     var sq = a[i] * a[i]; 
     b[i] = function() { return sq;} 
    } 
    return b; 
} 

x = sqFnList([3,4,5])[0]() 

Вопросы, что х = 25. Спасибо за помощь заранее.

+0

Поскольку все объекты являются только ссылками в JS, мы обычно не говорим о «указателях». Это просто «массив функций» – Bergi

+0

Это аккуратно, спасибо за головы. Спасибо всем, кто помогает мне. –

ответ

4

Ваши функции все содержат ссылки на одной и той же переменной sq, которая имеет значение 25, как только вы на самом деле вызывать функции. Вам нужно создать отдельное закрытие для каждой функции, каждый со своей собственной копией значения sq «s, чтобы захватить значение sq в то время вы хотите:

function sqFnList(a){ 
    var b = []; 
    for (var i = 0; i <a.length; i++) 
    { 
     var sq = a[i] * a[i]; 
     b[i] = function (the_sq) { 
      return function() { return the_sq;} 
     }(sq); 
    } 
    return b; 
} 

x = sqFnList([3,4,5])[0]() // x is 9 

Вот a fiddle to demonstrate.

2

sq имеет область действия sqFnList, и вы продолжаете обновлять значение, меняя его во всех замыканиях. Вы должны заставить новую область за кв:

function sqFnList(a){ 
    var b = []; 
    for (var i = 0; i <a.length; i++) 
    { 
     var sq = a[i] * a[i]; 
     (function(sq) { 
     b[i] = function() { return sq;} 
     })(sq); 
    } 
    return b; 
}