Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:使用全局变量四处走动_Javascript_Ajax_Global Variables - Fatal编程技术网

Javascript:使用全局变量四处走动

Javascript:使用全局变量四处走动,javascript,ajax,global-variables,Javascript,Ajax,Global Variables,我有一个由键盘处理程序触发的ajax调用,它返回一个jsonObj(我目前将其存储为一个全局变量),这个ajax调用立即完成。然后,如果用户单击鼠标,则调用另一个事件处理程序函数。但是,这个鼠标事件处理程序需要获得由另一个函数创建的json对象。[见下面的代码] var $jsonObj; function makeAjaxCall() { $jsonObj; //do ajax call ... } function updateInformation(text) {

我有一个由键盘处理程序触发的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);
,将所有的东西都放在一个巨大的函数中应该就可以了。我想知道还有什么其他优雅的方式?或者说,在这里使用全局方法更优雅


另外,

函数是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);
        });
    });
}($));
把所有的东西都放在一个巨大的函数中就可以了

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

我想知道还有什么其他优雅的方式

你不必把所有东西都放在那个范围内
makeAjaxCall
updateInformation
在松散耦合的情况下也可以保持全局性,即将该对象作为参数或将其返回给调用者

或者说,在这里使用全局方法更优雅


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

正如您所读到的,使用闭包或IIFE(或“一个巨大的函数”)是最干净的解决方案。所以基本上你的变量在这个函数的范围内。闭包是很好的实践,我建议里面的第一行是“严格使用”;要在可用的地方启用javascript严格模式。自动执行匿名函数——这个术语更好。