我有一个由键盘处理程序触发的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.
答案 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
的所有内容。
我想知道其他优雅的方式是什么?
您不必在该范围内粘贴所有。 makeAjaxCall
和updateInformation
在松散耦合时也可以保持全局 - 即将该对象作为参数或将其返回给调用者。
或者在这里使用全局更优雅的方法?
这几乎不是一个好的解决方案。