我有一个名为initData()的函数;该函数使用setInterval调用另一个函数,该函数每1000毫秒向我的服务器发送一次ping.
问题是我希望能够在一个页面上拥有多个此函数的实例.我目前的问题是,只要调用第二个实例,它就会覆盖第一个实例中的所有变量.
解决方法
在javascript中引入单独命名空间的唯一方法是使用函数调用.这是你如何做到的:
(function () { /* your stuff here */ }());
你将你的东西包装在一个匿名函数中,然后立即调用它.这样,即使名称相同,您的功能也将是独立的.
例
所以,例如,如果您有这样的代码:
var my,local,data; function initData() { // use my,local and data here. }
而你还有其他地方:
var some,other,data; function initData() { // use some,data here. }
然后一个initData将覆盖另一个initData.但是,如果你将每个包装在它自己的(function(){}());然后他们会分开.
(function () { var my,data; function initData() { // use my,local and data here. } }()); (function () { var some,data; function initData() { // use some,data here. } }());
但请注意,这些名称不再位于全局名称空间中,因此它们也不能在匿名函数之外使用.
一个全球性的
要控制在全局命名空间中显示的内容和内容,可以自定义通过一个全局对象(通常以全部大写字母)显示所需内容.
FOO.module1.initData(); FOO.module2.initData();
你可以通过确保FOO存在来做到这一点,如果不存在:创建它.
var FOO = this.FOO || {};
模块命名空间也是如此:
FOO.module1 = FOO.module1 ||{};
然后在匿名函数内部,暴露你想要的东西.
完整的例子
module1.js:
var FOO = this.FOO || {}; FOO.module1 = FOO.module1 ||{}; (function () { var my,local and data here. } FOO.module1.initData = initData; }());
module2.js:
var FOO = this.FOO || {}; FOO.module2 = FOO.module2 ||{}; (function () { var some,other and data here. } FOO.module2.initData = initData; }());
controller.js:
FOO.module1.initData(); FOO.module2.initData();
像写的控制器依赖于module1.js和module2.js,需要最后加载.这可以通过jQuery的document.ready之类的东西来避免,让它等待加载所有脚本.
jQuery(document).ready(function () { FOO.module1.initData(); FOO.module2.initData(); });
如果您还没有使用jQuery,可以使用像domReady这样的小脚本来避免膨胀.
原文地址:https://www.jb51.cc/js/151854.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。