this
во внутренней функции
function(){
var newName = this.names.length;
alert(newName);
}
не совпадает с this
во внешней функции.
work: function(){
$.map([1,2,3],function(){
var newName = this.names.length;
alert(newName);
});
}
Есть много способов, которыми люди могут обойти это:
Сохранить ссылку на внешнюю функцию this
как другую переменную
work: function(){
var that = this;
$.map([1,2,3],function(){
var newName = that.names.length;
alert(newName);
});
}
Как видите, вместо this
используется that
.
Используйте jQuery's $.proxy
work: function(){
$.map([1,2,3],$.proxy(function(){
var newName = this.names.length;
alert(newName);
}, this));
}
Что делает $.proxy
, так это создает другую функцию, которая вызывает функцию, которую вы передали (в данном случае, внутреннюю функцию), но явно устанавливает контекст функции (this
) для вторых аргументов.
work: function(){
$.map([1,2,3],function(){
var newName = this.names.length;
alert(newName);
}.bind(this));
}
Он работает так же, как $.proxy
в jQuery, но в этом вы вызываете метод bind
функции.
Это поддерживается не во всех браузерах, но в MDC реализована реализация JavaScript-функции Function.prototype.bind в . Вы можете использовать его.
this
в запутанном ключевом слове, и если вы хотите узнать больше о this
, тогда посмотрите на this .