Этот вопрос не характерен для jQuery, но характерен для JavaScript в целом. Базовая проблема состоит в том, как "направить" переменную во встроенных функциях. Это - пример:
var abc = 1; // we want to use this variable in embedded functions
function xyz(){
console.log(abc); // it is available here!
function qwe(){
console.log(abc); // it is available here too!
}
...
};
Эта техника полагается на использование закрытия. Но это не работает с this
, потому что this
псевдо переменная, которая может измениться от объема до объема динамично:
// we want to use "this" variable in embedded functions
function xyz(){
// "this" is different here!
console.log(this); // not what we wanted!
function qwe(){
// "this" is different here too!
console.log(this); // not what we wanted!
}
...
};
, Что мы можем сделать? Присвойте его некоторой переменной и используйте его через псевдоним:
var abc = this; // we want to use this variable in embedded functions
function xyz(){
// "this" is different here! --- but we don't care!
console.log(abc); // now it is the right object!
function qwe(){
// "this" is different here too! --- but we don't care!
console.log(abc); // it is the right object here too!
}
...
};
this
не уникально в этом отношении: arguments
другая псевдо переменная, которую нужно рассматривать тот же путь — путем искажения.
Да, это, кажется, единый стандарт. Некоторые кодеры используют сам, другие используют меня. Это используется в качестве ссылки назад на "реальный" объект в противоположность событию.
Это - что-то, что взяло меня некоторое время для реального получения, это действительно выглядит нечетным сначала.
я обычно делаю это правильно наверху своего объекта (извините мой демонстрационный код - это более концептуально, чем что-либо еще и не является уроком по превосходному методу кодирования):
function MyObject(){
var me = this;
//Events
Click = onClick; //Allows user to override onClick event with their own
//Event Handlers
onClick = function(args){
me.MyProperty = args; //Reference me, referencing this refers to onClick
...
//Do other stuff
}
}
Я не использовал jQuery, но в библиотеке как Прототип можно связать функции с определенным объемом. Таким образом с этим в памяти Ваш код был бы похож на это:
$('#foobar').ready('click', this.doSomething.bind(this));
связывать метод возвращает новую функцию, которая называет исходный метод с объемом, который Вы определили.
Я думаю, что это на самом деле зависит от того, что является Вами собирающийся делать в Вашем doSomething
функция. Если Вы собираетесь получить доступ MyObject
свойства с помощью этого ключевого слова тогда, необходимо использовать это. Но я думаю, что следующий фрагмент кода будет также работать, если Вы не сделаете никаких специальных вещей с помощью object(MyObject)
свойства.
function doSomething(){
.........
}
$("#foobar").ready('click', function(){
});