Закрытие Javascript - значение привязки вместо ссылки - PullRequest
3 голосов
/ 18 июля 2011

Приведенный ниже пример был взят из книги «Javascript: хорошие части». Автор говорит, что вспомогательная функция возвращает функцию, которая связывается с текущим значением из var i.

Может кто-нибудь объяснить, что заставляет связывать ЗНАЧЕНИЕ вместо ССЫЛКИ var i, потому что функция helper является закрытием функции add_the_handler и должна видеть только ссылку var i:

var add_the_handlers = function (nodes) {
   var helper = function (i) {
      return function (e) {
        alert(i);
      };
    };
    var i;
    for (i = 0; i < nodes.length; i += 1) {
       nodes[i].onclick = helper(i);
    }
};

Ответы [ 3 ]

5 голосов
/ 18 июля 2011

Если вы скажете:

nodes[i].onclick = function(){ alert(i) };

Функция не будет иметь свою собственную копию i, поскольку i не объявлено в области действия функции.

Чтобы помочь вам увидеть это лучше, я изменил ваш код выше:

var add_the_handlers = function (nodes) {
    var helper = function(t) {
      // t is in the scope of "helper"
      return function(e){
        // e is in the scope of this anonymous function
        // and is not used
        alert(t);
      };
    };

    // Variables declared here are in the scope of "add_the_handlers"
    var i;
    for (i = 0; i < nodes.length; i += 1) {
       nodes[i].onclick = helper(i);
    }
};

В «реальном мире» вы часто будете видеть код, подобный приведенному выше, сокращенный, чтобы он выглядел так:

1 голос
/ 18 июля 2011

Вы передаете текущее значение из i в функцию helper. Внутри этой функции переменная i, (с непонятным названием) параметр функции, отличается от любых других i. Возвращаемое закрытие, таким образом, связывается с этим конкретным i (на самом деле [[scope]], которое содержит это i, но ...).

Удачного кодирования.

0 голосов
/ 18 июля 2011

Это предположение: i является примитивом, поэтому к нему всегда можно получить доступ по значению, а не по ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...