请帮我理解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.

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

相关文章

页面搜索关键词突出 // 页面搜索关键词突出 $(function () {...
jQuery实时显示日期、时间 html: <span id=&quot...
jQuery 添加水印 <script src="../../../.....
中文:Sys.WebForms.PageRequestManagerParserErrorExceptio...
1. 用Response.Write方法 代码如下: Response.Write(&q...
Jquery实现按钮点击遮罩加载,处理完后恢复 思路: 1.点击按...