2016-03-17 3 views
1

Я читаю исходный текст подчеркивания и, в частности, смотрю на метод _.each.Подчеркивающий метод _.each

Я убрал это до этого, но я немного смущен, как это работает, передавая функцию.

_.each = function(obj, iteratee, context) { 
    var i, length; 
    for (i = 0, length = obj.length; i < length; i++) { 
     iteratee(obj[i], i, obj); 
    } 
    return obj; 
}; 

Затем в консоли, если я пишу это:

var sum = 0; 
_.each([1,2,3], function(n){ 
    sum += n; 
});     

//sum === 6; 

, что я пытаюсь понять, что именно происходит в методе _.each.

obj === [1,2,3] и iteratee == function(n){sum += n}.

При подключении этого в петлю, это правильно при первом запуске цикла

iteratee(obj[i], i, obj);

приравнивает к следующему?

function (n){ 
    sum += n; 
}([1,2,3][0], 0, [1,2,3]) 

Как вызывается функция? Вызывает ли цикл его? Я не думаю, что это делает

Когда я играю вокруг и использовать следующий код я получаю сообщение об ошибке ниже:

for(var i = 0; i < 3; i++){ 
    function (n){ 
     sum += n; 
    }([1,2,3][i], i, [1,2,3]); 
} 
console.log(sum) 

//Uncaught SyntaxError: Unexpected token (

Может кто-нибудь пролить свет на то, что здесь происходит?

+0

Try обернуть функцию и его параметры в скобках. Например: '(function (n) {sum + = n;} ([1,2,3] [i], i, [1,2,3])).'. –

+0

Я сделал это, и он работает, но где в источнике это 'IIFE'? –

+0

Вы передаете функцию в качестве параметра. 'iteratee' - это функция. –

ответ

1

Вы были правы, просто ваш синтаксис как проблема:

var sum = 0; 
for(var i = 0; i < 3; i++){ 
    (function (n){ 
    sum += n; 
    })([1,2,3][i], i, [1,2,3]); 
} 
console.log(sum) 

Что является определяющим новой анонимной функцией на каждую итерацию и ссылающийся на него сразу же, что называется Immediately Invoked Function Expression

+0

является 'iteratee' не равным' function (n) {sum + = n;} ', поскольку он передается как аргумент' iteratee'? Я знаю о «IIFE», и именно здесь происходит мое замешательство. Я не вижу, где это «IIFE», поскольку функция равна «iteratee» –

+1

Это так. За исключением случаев, когда вы хотите определить и вызвать функцию, вам нужно сделать это в двух атомных операциях. Скобка позволяет движку JS сначала определять анонимную функцию, которая содержится в этих скобках, а затем вызывать ее с заданными параметрами. Опущение скобки является синтаксической ошибкой, поскольку движок не может знать, в каком порядке интерпретировать введенные вами данные. – floribon

+1

Чтобы ответить на ваш обновленный комментарий, разница в том, что мы не назначаем эту функцию в имени переменной, таком как iteratee.Мы определяем функцию, все еще анонимную, и сразу вызываем ее. И в конце этого звонка это забвение, готовое к сбору мусора: ничто не ссылается на него в коде. – floribon

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