Javascript 共享多个JS变量<;脚本>;阻碍

Javascript 共享多个JS变量<;脚本>;阻碍,javascript,ajax,codeigniter,variables,Javascript,Ajax,Codeigniter,Variables,我正在开发CodeIgniter应用程序 我有一个视图,我们称之为日历,其中有一个JS/jQuery块。看起来像这样: $(document).ready(function() { $("#day_list").fadeIn(600); // init var current_month = <?= $init['current_month']; ?>; var current_year = <?

我正在开发CodeIgniter应用程序

我有一个视图,我们称之为日历,其中有一个JS/jQuery
块。看起来像这样:

    $(document).ready(function()    {

        $("#day_list").fadeIn(600);

        // init
        var current_month = <?= $init['current_month']; ?>;
        var current_year = <?= $init['current_year'] ?>;

        // previous, next month ajax call
        $(".previous, .next").click(function(event) {
            // do stuff to these variables, then ajax call.
            $.ajax({
                // ajax
            });
        });
    });
var foo = foo || {} //Use existing foo or create an empty object.
foo.bar = foo.bar || {}
foo.bar.baz = foo.bar.baz || {}
$(文档).ready(函数(){
美元(“#日名单”)。法登(600);
//初始化
var当前_月=;
var本年=;
//上个月、下个月的ajax调用
$(“.previous,.next”)。单击(函数(事件){
//对这些变量执行一些操作,然后调用ajax。
$.ajax({
//阿贾克斯
});
});
});
在另一个视图“我的页脚”中,我有另一个脚本块,它应该使用相同的变量(当前月份和当前年份)。然而,它不知道它们的存在。将这些变量从第一个
块传递到另一个块的最快、最简单的方法是什么?由于我的应用程序的构建方式,我无法将这两个模块放在一起。我应该为它编写一个函数来获取并返回这些值(我应该怎么做?我是个新手)还是有更简单的方法


非常感谢

将变量声明为全局变量。只需将它们移到文档就绪功能之外

var current_month = <?= $init['current_month']; ?>;
var current_year = <?= $init['current_year'] ?>;

$(document).ready(function() {
....
});
var当前月=;
var本年=;
$(文档).ready(函数(){
....
});

current\u month
current\u year
现在可以从任何脚本块访问。

如果在任何功能块之外声明变量,它们将是全局变量,可用于页面上的任何脚本

var current_month;
var current_year;

$(document).ready(function () {

    // init
    current_month = <?= $init['current_month']; ?>;
    current_year = <?= $init['current_year'] ?>;

    ...etc...

});
var当前月;
本年的var;
$(文档).ready(函数(){
//初始化
当前_月=;
本年度=;
等
});

由于您在函数中声明了这些变量,因此它们具有局部作用域。将其移到外部以使其全球化:

// init
var current_month = <?= $init['current_month']; ?>;
var current_year = <?= $init['current_year'] ?>;

$(document).ready(function()    {

    $("#day_list").fadeIn(600);

    // previous, next month ajax call
    $(".previous, .next").click(function(event) {
        // do stuff to these variables, then ajax call.
        $.ajax({
            // ajax
        });
    });
});
//初始化
var当前_月=;
var本年=;
$(文档).ready(函数(){
美元(“#日名单”)。法登(600);
//上个月、下个月的ajax调用
$(“.previous,.next”)。单击(函数(事件){
//对这些变量执行一些操作,然后调用ajax。
$.ajax({
//阿贾克斯
});
});
});
比使用全局变量更好的解决方案是在HTML中按语义存储它们,然后通过jQuery检索它们:

<body data-month="<?= $init['current_month']; ?>" data-year="<?= $init['current_year'] ?>">

$(document).ready(function()    {
    $("#day_list").fadeIn(600);

    var current_month = $("body").data("month");
    var current_year = $("body").data("year");

    // previous, next month ajax call
    $(".previous, .next").click(function(event) {
        // do stuff to these variables, then ajax call.
        $.ajax({
            // ajax
        });
    });
});
该“var”声明初始化就绪功能范围内的两个变量(
当前月
当前年
),因此它们在其他地方不可用。您可以全局声明它们:

var current_month;
var current_year;
$(document).ready(function()    {
    ...
    current_month = ...
}

这样,您就可以在底部脚本中使用它们。

学习用JavaScript命名变量的名称空间非常重要。范围很重要,而且非常重要。现在,因为您正在使用“var”关键字,所以您的内容将在本地范围内

这里的一些其他答案说,您应该将它们转移到全球范围。这是可行的,除非有其他东西无意中覆盖了它们。我非常不同意这种方法,全局范围的变量在JavaScript中是不好的做法

名称空间的工作原理如下:

    $(document).ready(function()    {

        $("#day_list").fadeIn(600);

        // init
        var current_month = <?= $init['current_month']; ?>;
        var current_year = <?= $init['current_year'] ?>;

        // previous, next month ajax call
        $(".previous, .next").click(function(event) {
            // do stuff to these variables, then ajax call.
            $.ajax({
                // ajax
            });
        });
    });
var foo = foo || {} //Use existing foo or create an empty object.
foo.bar = foo.bar || {}
foo.bar.baz = foo.bar.baz || {}
等等等等

这似乎需要做更多的工作,但它也可以保护您的变量

您还可以添加一个简单的名称空间函数,该函数可以根据窗口对象安全地命名所有内容。(我从很久以前的某个地方抄袭了这个,我想我对它做了一些修改,但可能没有)

把它放在你的应用程序的顶部,你可以用$.namespace(“myapp.mydata”)命名名称空间,然后说myapp.mydata.currentYear=

$.namespace = function() {
    var a=arguments, o=null, i, j, d;
    for (i=0; i<a.length; i=i+1) {
        d=a[i].split(".");
        o=window;
        for (j=0; j<d.length; j=j+1) {
            o[d[j]]=o[d[j]] || {};
            o=o[d[j]];
        }
    }
    return o;
};
$.namespace=function(){
变量a=参数,o=null,i,j,d;

对于(i=0;iThanks。一旦我了解了这个概念,我一定会尝试一下。谢谢你推荐这本书。我一直想买一本书,但是书太多了,哈哈。谢谢!没问题。很多人认为好的部分是关于JavaScript语言的权威书。一个主要是网页设计师的前端开发人员,这样做总是很有诱惑力的,将JS变量存放在HTML中供以后检索,但这真的是一个好的、可维护的解决方案吗?啊……非常感谢。还必须将它移到(函数($){})(jQuery);包装器之外。