请帮我理解Javascript匿名函数和jQuery .proxy()

前端之家收集整理的这篇文章主要介绍了请帮我理解Javascript匿名函数和jQuery .proxy()前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直试图围绕 javascript函数和范围如何工作,这对我来说没有意义.有人可以解释为什么以下代码输出:’动物说喵’而不是’小猫说喵’?
(function($,exports){
  var animal = function(){};
  exports.Animal = animal;
})(jQuery,window);

(function($,Animal){
  var kitty = new Animal;
  kitty.sayHi = function(){
    console.log(this);
    console.log('says meow');
  }
  $($.proxy(function(){
    $('#js_test').click($.proxy(kitty.sayHi,kitty));
  },kitty))
})(jQuery,Animal);

UPDATE

@FunkyFresh在注释中指出console.log在传递一个对象时调用toString,默认情况下返回对象的类型(animal).当我用上面的代码更新时

animal.prototype.name = 'Mammal';

在顶部的代码块中,和

kitty.name = 'Zax';

底部,控制台输出’Zax说喵’,这似乎是正确的.

解决方法

(function($){})(jQuery)

在此代码中(function($){})声明该函数.然后(jQuery)立即调用传递jQuery对象的函数.

所以第一个代码块传递给jQuery和window对象. Animal被添加到window对象中,这是全局范围.

在第二个块中,将click事件添加到元素中,并将kitty.sayHi作为事件处理程序传入.但是,如果事件处理程序未被代理,则eventhandler中的this关键字将返回触发事件的元素.因此,通过使用代理,事件处理程序的范围变为kitty.

我希望这是正确的,这对我来说也是新的.

猜你在找的jQuery相关文章