JS λ-функции и переменные «верхнего контекста» - PullRequest
2 голосов
/ 01 августа 2010

Скажем, у меня есть некоторый контекст, в котором установлены переменные и вызвана λ-функция, которая использует их напрямую:

function outerContext(){
    ...
    var data = ...; // some data the script uses
    ...
    someObject.method = function(){
        data; // the variable is used here
        };
    ...
    }

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

С какими опасностями я могу столкнуться при таком подходе, когда использую этот динамически созданный метод? Должен ли я всегда давать это data в качестве аргумента или это нормально?

Ответы [ 2 ]

3 голосов
/ 01 августа 2010

Внутренняя функция не имеет доступа к «снимку», она имеет полный доступ к переменной data.

function outer() {
    var data = 1;

    ...

    someObject.method = function () {
        data = 42;
    };

    someObject.method();
    // data == 42
}

(Реальное объяснение состоит в том, что при использовании data во внутренней функции Javascript попытается выяснить, в какой области находится data. Он будет проходить по цепочке областей действия, чтобы найти место, где была создана переменная и это переменная, которая будет использоваться.)

Там нет "опасности", это одна из основных компетенций Javascript. Это как метод объекта, изменяющий свойства объекта. Конечно, вам нужно позаботиться о том, что вы хотите сделать, действительно ли вы хотите изменить переменную или вы просто хотите использовать ее локально?

Для «снимка» необходимо использовать замыкание:

function outer() {
    var data = 1;

    ...

    someObject.method = (function (data) {
        return function () {
            data = 42;
        }
    })(data);

    someObject.method();
    // data == 1
}
3 голосов
/ 01 августа 2010

Я не могу думать о каких-либо «опасностях», кроме возможности вызвать циклическую ссылку и, таким образом, утечку памяти в случае объектов DOM или чего-либо подобного.класс.

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