JavaScript设计模式,一个函数正在被覆盖

JavaScript design pattern, a function is being overwritten

本文关键字:函数 覆盖 一个 设计模式 JavaScript      更新时间:2023-10-25

代码在这里:http://jsfiddle.net/nNdna/实时页面在这里:http://www.sumsy.com/demos/socialFeeds/

请转到实时页面并检查调试器。你应该看到";pinterest init";显示在日志中。但我期待着";twitter初始化";显示在日志中,因为我是从主函数调用Twitter.init的。

我的设置是:有两个匿名的自执行函数,在中都有init函数

var Twitter = (function($, window){ ... init = function ... 
var Pinterest = (function($, window){ ... init = function ... 

然后在我的主函数中,我调用了Twitter.init(user_Twitter_options);

但看起来Pinterest.init实际上是在被调用。看起来Pinterest.init覆盖了Twitter.init功能。

有人能告诉我怎么了吗?我不应该有2个匿名自执行函数?

手头的代码有很多问题。

TwitterPinterest都被分配给调用返回this的匿名函数的结果,其中this将等于window,因为您实际上并没有用new创建新对象,也没有做任何将this设置为某个值的操作。

在这两个匿名函数中,您分配init = ...而不使用var声明它,这意味着init将是一个全局变量。因此,Pinterest部分中的代码将覆盖最初在Twitter部分中创建的全局init

假定全局基本上是window对象的属性,并且TwitterPinterest都被分配给window,这意味着调用Twitter.init()Pinterest.init()与调用window.init()相同。所以这就是为什么他们都做同样的事情。

不幸的是,你的代码太长了,我无法提供工作版本,所以我建议你阅读部分或全部参考资料:

  • 使用对象-MDN
  • 深度JavaScript模块模式-非常好
  • JavaScript闭包与模块模式
  • JavaScript模块模式的一种变体

您需要在init前面添加var,否则您将其放入全局范围。这意味着init将等于最后一个赋值,在本例中是Pinterest版本。