Понимание аргумента "this" в function.apply при установке его на набор jQuery - PullRequest
2 голосов
/ 27 января 2012

Я пытаюсь обернуть голову вокруг функции Javascript.apply ().Вы используете его так: f.apply(obj,args)

для запуска функции f с заданными аргументами args, с внутренним использованием функции this, сопоставленным с объектом obj.

Вот простой пример, показывающий, как все это работает для ускорения работы:

var o = { 
  state : 0, 
  plus : function(){
    this.state += 1;
  }
}
//o is an object with a state-tracking var and a function that will operate on it
o.state
// 0
o.plus()
o.state
// 1
newO = {state:3}
// newO  is similar to the original object, but doesn't have that state-manipulating function
newO.state
// 3
o.plus.apply(newO,[])  // call o's function, but hijack the 'this' reference to point to newO
newO.state
// 4

Круто.Итак, я написал функцию для решения проблемы нулевого указателя в javascript с помощью определенного плагина jquery.Если набор jQuery пуст, он просто не запускает функцию:

var applyIfPresent = function(jqObj,func,args){
  //only works if jquery has the func you supply
  if(jqObj.length){
    jqObj[func].apply(jqObj,args);
  }
}

Я выполнил простой тест: applyIfPresent($("input"),"css",["background","blue"]); Чтобы узнать, будет ли он обобщаться в набор jQuery из нескольких элементов,Кажется, он работает нормально, но я понятия не имею, как внутренности jQuery и использование this переводят на эту схему.Мне нравится, что это похоже на магию, но, если честно? Я научился немного бояться магии.

Как f.apply или jQuery все это понимают, чтобы заставить его работать?

Ответы [ 2 ]

2 голосов
/ 27 января 2012

это не та магия, вы, кажется, прекрасно это понимаете на примере выше.
когда вы делаете

jqObj[func].apply(jqObj,args);

это в основном то же самое, что и

$(jqObj).func(args);
2 голосов
/ 27 января 2012

.apply() это не функция JQuery, это базовая функция языка JavaScript.Скорее всего, вы не найдете ничего полезного в исходном коде JQuery, поскольку здесь они не изобрели колесо.

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply

...