Javascript:使用全局变量

时间:2014-06-10 19:18:51

标签: javascript ajax global-variables

我有一个由键盘处理程序触发的ajax调用并返回一个jsonObj(我当前正在存储一个全局变量),这个ajax调用立即完成。然后,如果用户单击鼠标,则调用另一个事件处理函数。但是,此鼠标事件处理程序将需要获取由另一个函数创建的json对象。 [见下面的代码]

var $jsonObj;


function makeAjaxCall() {
   $jsonObj;  //do ajax call
   ...
}

function updateInformation(text) {
   //use $jsonObj here
}

function mouseClickHandler(e) {
   updateInformation(text);
   ...
}

function  keydownHandler(e) {
   makeAjaxCall();
   updateInformation(text);
   ...
}

addEventListener("mousedown", mouseClickHandler, false);
addEventListener("keydown", keydownHandler, false);

According to this stackoverflow answer,将所有内容都放在一个巨大的函数中应该可以解决问题。我想知道其他优雅的方式是什么?或者在这里使用全球更优雅的方法?

P.S。 Here's what the flow looks like in a diagram to see my thought process.

2 个答案:

答案 0 :(得分:0)

函数是javascript中唯一创建隔离范围的东西。

您不应该使用自己的对象/函数污染全局范围。

你是正确的,将代码包装在一个巨大的函数中可以解决你的问题。

(function(){
    //Put all your code here
}());

这是一个自动执行的匿名函数,它将在执行javascript时立即执行。

如果您需要传入依赖项以与代码一起使用,您可以这样做。

(function(param1, param2){
    //Put all your code here
}(arg1, arg));

示例:

(function(jQuery){
    var $ = jQuery;

    $("#target").mousedown(function() {
        updateInformation($(this).text());
        ...
    });

    $("#target").keydown(function() {
        $.getJSON("example.json")
        .done(function(data) {
            updateInformation(data.text);
        })
        .fail(function(error) {
            console.log("error: " + error);
        });
    });
}($));

答案 1 :(得分:0)

  

将所有东西都放在一个巨大的功能中应该可以解决问题

是的,您需要在同一范围(功能)中粘贴想要访问$jsonObj的所有内容。

  

我想知道其他优雅的方式是什么?

您不必在该范围内粘贴所有makeAjaxCallupdateInformation在松散耦合时也可以保持全局 - 即将该对象作为参数或将其返回给调用者。

  

或者在这里使用全局更优雅的方法?

这几乎不是一个好的解决方案。