2014-02-09 2 views
0

Как анонимная функция знает, какие параметры передаются? Например,Как анонимные функции работают в jQuery/Javascript?

Случай 1:

$("li").each(function(index) { 
    console.log(index + ": " + $(this).text()); 
}); 

Случай 2:

$("li").each(function(e) { 
    e.preventDefault(); 
}); 

Случай 3:

$("li").each(function(index, element) { 
    console.log(index + ": " + element + $(this).text()); 
}); 

В каждом из этих случаев, как это анонимная функция знает, что e, index, element есть?

+2

Потому что '.each' передает эти значения функции. Также обратите внимание, что ваш второй пример не работает, потому что '.each' не передает объект события для обратного вызова. И вы можете назвать параметры, как хотите. –

+0

Во всех ваших случаях первый элемент всегда будет одним и тем же. index = e. В javascript вам не нужно указывать количество параметров, отправляемых функции. Вам просто нужно, чтобы функция адаптировалась к такому числу параметров, и каждый новый параметр будет некоторым уточненным. Затем '.each' передает значения, указанные вами для анонимной функции. – Codel

ответ

2

Потому что the code in each вызовет функцию, которую вы передадите ей с аргументами.

function notEach(callback) { 
    callback(1,2,3); 
} 

notEach(function (one, two, three) { 
    console.log(one, two three); 
}); 
+0

Да, но почему вы не можете использовать index.preventDefault(), например? Извините, я ноб, и я этого не понимаю. – guest

+0

@guest: Вы путаете '.each' с одним из методов обработки событий, например' .click'. См. Https://api.jquery.com/each/ и https://api.jquery.com/click/ –

+0

@guest - поскольку он не передает объект события (что имеет смысл, поскольку каждый из них используется для запускать некоторый код для каждого элемента в массиве, а не настраивать обработчик событий). – Quentin

0

Если мы можем говорить о each, как будто это маленький робот, each говорит функции, что ее аргументы. Он подбирает коллекцию и функцию, помещает элементы коллекции в функцию по одному, и выставляет выходы вместе как коллекцию. http://api.jquery.com/jquery.each/

Вы должны понимать, что при написании анонимной функции это как процедура, так и объект. Вы одновременно определяете для Javascript, как выполнять эту функцию («зная, как» ее называть) и что это за функция («зная, что» это конкретный объект). Некоторые языки все еще используются, когда функция не является объектом. Так что, возможно, этот факт был запутан, когда вы столкнулись с этим здесь.

0

naive implementation из each функции:

function $(selector) { 

    var elements = document.querySelectorAll(selector); 

    return { 
     each: function (fn) { 
      for (var i = 0; i < elements.length; i++) { 
       fn(i, elements[i]); 
      }   
     } 
    }; 
} 

Функция JQuery возвращает объект с each функции. Эта функция имеет доступ к соответствующим элементам и итерации по ним. Он может вызывать функцию, которую вы дали ей на каждой итерации, и передавать текущий индекс и соответствующий ему элемент.

Ваш второй случай не имеет для меня большого смысла. As far as I know jQuery, никакое событие не передается функции each.

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