当你将它设置为jQuery集时,理解function.apply中的“this”arg

时间:2012-01-27 18:31:51

标签: javascript jquery apply jquery-validate

我正试图围绕Javascript的function.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 个答案:

答案 0 :(得分:2)

.apply()不是JQuery功能,它是核心JavaScript语言功能。你可能在JQuery源代码中找不到任何有用的东西,因为他们没有在这里发明轮子。

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

答案 1 :(得分:2)

这不是那种魔力,你似乎完全理解上面的例子。
当你做的时候

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

它与做

基本相同
$(jqObj).func(args);