Javascript: доступ к нужной области применения «под» (...) - PullRequest
4 голосов
/ 13 апреля 2010

Это очень старая проблема, но я не могу разобраться с другими решениями, представленными здесь.

У меня есть объект

function ObjA() {
    var a = 1;
    this.methodA = function() {
        alert(a);
    }
}

который создается как

var myObjA = new ObjA();

Позже я назначаю methodA в качестве функции-обработчика во внешней Javascript Framework, которая вызывает его с помощью метода apply(...).

Когда внешний каркас выполняет my methodA, this принадлежит функции каркаса, вызывающей мой метод.

Поскольку я не могу изменить способ вызова моего метода, как мне восстановить доступ к закрытой переменной a?

Мое исследование говорит мне, что замыкания могут быть тем, что я ищу.

Ответы [ 4 ]

2 голосов
/ 13 апреля 2010

У вас уже есть закрытие. Когда вызывается methodA, доступ к a будет работать нормально.

Свойства объекта отличаются от областей видимости. Вы используете области для реализации чего-то, что на других языках ведет себя как bit , как «закрытые члены», но a является локальной переменной в родительской области, а не член myObjA (частный или другой). Наличие функции типа methodA для сохранения доступа к переменным в родительской области - это то, что означает «замыкание».

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

Поскольку a не является свойством this, не имеет значения, что this не сохраняется при перезвоне. Если вам do нужно получить правильный this, тогда да, вам потребуется дополнительная работа, либо с использованием другого замыкания над myObjA:

onclick= function() { myObjA.methodA(); };

или с использованием Функция # bind :

onclick= myObjA.methodA.bind(myObjA);
1 голос
/ 13 апреля 2010

да, ты прав. Вместо ссылки на метод

 var myObjA = new ObjA();

 libraryCallback = myObjA.methodA

пройти закрытие

 libraryCallback = function() { myObjA.methodA() }
0 голосов
/ 13 апреля 2010

Я бы сделал это:

function ObjA() {
    this.a = 1;
    this.methodA = function() {
        alert(this.a);
    }
}

function bindMethod(f, o) {
    return function(){
        return f.apply(o, arguments);
    }
}

var myObjA = new ObjA();
myObjA.methodA = bindMethod(myObjA.methodA, myObjA);
...

Где bindMethod связывает метод methodA, чтобы всегда быть методом myObjA, при этом передавая любые аргументы, которые function() {myObjA.methodA()} не делает.

0 голосов
/ 13 апреля 2010

Если вы используете jQuery javascript framework, проще всего использовать proxy :

$('a').click($.proxy(myObjA, 'methodA'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...