微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

原文地址:https://www.jb51.cc/jquery/156840.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐