jQuery – 在函数之间共享变量

这应该相当简单; 我很确定我不理解它。

仅供参考,该网站使用jQuery在内容上运行ajax .load()。

在我的主父页面上,在标题中我有我的nav .load()jQuery代码: –

 $(document).ready(function(){ $('a.nav').click(function() { page = $(this).attr('page'); projID= $(this).attr('projID'); if($("#mainRight").is(":visible")) { $('#mainRight').hide(200); } switch(page) { case 'projSettings': $("#mainRight").load("content.php?load=" + page, { projID: projID}); break; case 'projMetrics': $("#mainRight").load("content.php?load=" + page, { projID: '5000227' }); break; case 'projTags': $("#mainRight").load("content.php?load=" + page, { projID: projID}); break; case 'projShare': $("#mainRight").load("content.php?load=" + page, { projID: '5000227' }); break; } $('#mainRight').show(300); }); 

现在,基本上我希望将projID重新记录,以供其他不提供它的a.nav点击使用。

调用此链接的锚点看起来像Settings ,我将其保存为522.因此,其他请求(没有projID,因为数据已被加载到DOM中以用于其他导航,并且他们不知道 projID。我希望这是有意义的。

所以,我想知道在前一次调用中已经使用了projID时,如何使用settings等链接。

有什么想法吗?

好吧,具有讽刺意味的是,你已经在全局范围内保存了projID (更好地说,在你的声明中使用var ,在window object中。

因此,一旦初始化,您就可以从代码中的任何位置访问projID

无论如何这不是一个好的实践,相反,这是一个非常糟糕的实践。

我能想到的最好的方法是创建自己的应用程序对象,在那里存储所有数据并从那里访问它。

 var your_application = { var foo = 'bar', base = 'ball'; }; // your_application.foo = 'another bar'; 

使用闭包函数式编程可以推动这个原理。 存储和保持数据本地而非全局(窗口)的更好的解决方案可能看起来像

 var your_application = function(){ var foo = 'bar', base = 'ball'; return { getfoo: function(){ return foo; }, setfoo: function(newfoo){ foo = newfoo; } }; }); var app = your_application(); app.setfoo('foobar!'); alert(app.getfoo()); 

这是有条理的 javascript编程的想法。 那里有一些好书,我建议用Javascript: the good parts开始Javascript: the good parts道格拉斯克罗克福德Javascript: the good parts

另一个解决方案应该是jQuery .data()方法,它能够将数据存储在全局哈希中。

 // store $.data(document.body, 'projID', projID); // access var foo = $.data(document.body, 'projID'); // remove $.removeData(document.body, 'projID'); 

只需在js脚本的开头键入以下行 –

 var projID; 

只需在函数外部定义变量,它就会变为全局变量。

是使其成为全局变量。 添加var projID; 在开始脚本。 同意萨达特。

如果我理解正确,你有一个函数被应用为各种a.nav元素的a.nav .click()处理程序,并且你希望projID变量只需要设置一次并记住以后调用同一个函数。

这似乎是静态变量的完美用例。 静态变量将在函数调用之间保留其值,但仍在该函数范围内。 JavaScript本身没有显式静态变量,但您可以通过将变量定义为该函数的成员来模拟它们; 最终结果是一样的。 以下是该链接的代码:

 function countMyself() { // Check to see if the counter has been initialized if ( typeof countMyself.counter == 'undefined' ) { // It has not... perform the initilization countMyself.counter = 0; } // Do something stupid to indicate the value alert(++countMyself.counter); } 

我没有测试过它,但是下面的修改应该是这样的:

  

试试这个,我让你的代码更简单..

  

原型不是更好用吗?

 function System() { settings = { 'Foo': 'Bar' } } //Then define a prototype System.prototype.getSetting = function(key) { return settings[key] || undefined; } System = new System(); alert(System.getSetting('Foo'));​