JavaScript设计模式,一个函数正在被覆盖
JavaScript design pattern, a function is being overwritten
代码在这里: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个匿名自执行函数?
手头的代码有很多问题。
Twitter
和Pinterest
都被分配给调用返回this
的匿名函数的结果,其中this
将等于window
,因为您实际上并没有用new
创建新对象,也没有做任何将this
设置为某个值的操作。
在这两个匿名函数中,您分配init = ...
而不使用var
声明它,这意味着init
将是一个全局变量。因此,Pinterest
部分中的代码将覆盖最初在Twitter
部分中创建的全局init
。
假定全局基本上是window
对象的属性,并且Twitter
和Pinterest
都被分配给window
,这意味着调用Twitter.init()
和Pinterest.init()
与调用window.init()
相同。所以这就是为什么他们都做同样的事情。
不幸的是,你的代码太长了,我无法提供工作版本,所以我建议你阅读部分或全部参考资料:
- 使用对象-MDN
- 深度JavaScript模块模式-非常好
- JavaScript闭包与模块模式
- JavaScript模块模式的一种变体
您需要在init
前面添加var
,否则您将其放入全局范围。这意味着init将等于最后一个赋值,在本例中是Pinterest版本。
- 覆盖函数中的函数
- javascript函数将数据添加到屏幕,但随后被另一个函数覆盖
- Javascript重新定义和覆盖现有的函数体
- 如何在javascript中覆盖函数的行为
- 覆盖Jquery's函数
- 如何在Extjs中覆盖lovcombo中的函数
- 如何覆盖Backbone's解析函数
- 如何通过 JQuery ajaxSend 事件覆盖成功函数
- 覆盖主干的解析函数
- 覆盖上下文.属性和函数
- 有没有办法覆盖 setTimeout 函数,使其使用微秒而不是毫秒
- 被覆盖的 setTimeout 变量中的函数
- 为什么某些原型函数覆盖有效而其他函数无效
- JavaScript - 使用包含异步回调但仍返回原始值的函数覆盖函数
- 带有knockout.js函数覆盖的Javascript
- Javascript函数覆盖原型
- 函数覆盖类,而不是添加新的
- 是否可以用自定义函数覆盖window.location函数
- javascript函数覆盖
- 有没有办法使用 jsp 中包含的 js 文件中的函数覆盖 jsp 中存在的 js 函数