Какой самый простой и краткий способ получить доступ к внешним изнутри обратного вызова в JavaScript? - PullRequest
0 голосов
/ 19 апреля 2011

Я знаю, что следующий код может получить доступ к этому.


var o = function() {
    var that = this;
    this.a = 1;
    $('html').click(function() {
        alert(that.a);
    });
}
new o();

Но я не хочу использовать два имени переменных (например, это и то) для одного и того же объекта.
И я не хочу многократно писать var that = this на каждом уроке.

Я думаю, что следующий код, который использует _this вместо этого, немного проще.


var o = function() {
    var _this = this;
    this.a = 1;
    $('html').click(function() {
        alert(_this.a);
    });
}
new o();

Но есть ли другие более простые и короткие способы?

Ответы [ 2 ]

1 голос
/ 19 апреля 2011

Мне действительно нравится функция Ext * createDelegate, которая позволяет вам установить значение this для любой функции при ее создании.

Вот менее функциональная версия createDelegate, которую можно включить вВаша страница:

Function.prototype.createDelegate = function(thisObj) {
    var method = this;
    return function() {
        return method.apply(thisObj || window, arguments);
    };
}

И вот как вы можете использовать это в своем примере, никогда не устанавливая this для переменной:

var o = function() {
    this.a = 1;
    $('html').click(function() {
        alert(this.a);
    }.createDelegate(this));
}
new o();

Полная версия Ext's createDelegateдавайте передадим параметры в качестве второго аргумента, и они могут использоваться вместо, вставляться или добавляться в список аргументов, которые будут регулярно передаваться в функцию, для которой вы создаете делегат

0 голосов
/ 19 апреля 2011

вот некоторый похожий код, но я считаю, что он «безопаснее» чем ваш пример, если вы создаете более 1 экземпляра 'o' каждый экземпляр может обновлять свойство 'a'

var bar = function() {
        var that = {};
        that.a = 1;
        that.showA = function () {
            $('html').click(function() {
                alert(that.a);
            });
        };
        return that;
}
var instanceOfBar = bar();
instanceOfBar.showA();

Я мог бы быть здесь с базы, у меня не было моих рук в javascript в течение нескольких месяцев, так что ржаво сейчас

...