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