如何在JavaScript中设置全局变量和全局函数

时间:2018-07-17 16:07:55

标签: javascript jquery

在我的language.js中,我有:

function setCookie(cookie) {
  var Days = 30; //this cookie will keep 30 days 
  var exp = new Date(); //new Date("December 31, 9998");
  exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
  document.cookie = cookie + ";expires=" + exp.toGMTString();
}

function setLanguage(lang) {
  setCookie("lang=" + lang + "; path=/;");
  translate(lang);
}

稍后:

switch (getCookieVal("lang")) {
  case "en":
    setLanguage("en");
    break
  case "zh":
    setLanguage("zh");
    break
  default:
    setLanguage(systemLang);
}

这使console.log(getCookieVal("lang"));打印出zh。简而言之,它可以工作,但是,如果我在名为console.log(getCookieVal("lang"))的另一个文件中使用data.js则行不通。

我真的需要使用getCookieVal("lang")来根据Cookie语言确定要使用的变量。

这是完整的代码:

var dict = {};
var systemLang = navigator.language.toLowerCase().slice(0, 2);

我已经将函数从包装器中取出,因此现在应该是全局函数,但仍未定义。使问题变得简单。您会看到,我将systemLang设置为全局变量,但是在其他console.log(systemLang)文件中使用了.js。没有定义。

2 个答案:

答案 0 :(得分:2)

听起来这些功能都在某种包装中,例如jQuery ready回调:

$(function() {
    function setCookie(cookie) {
        // ...
    }
    function setLanguage(lang) {
        // ...
    }
});

或范围界定的IIFE:

(function() {
    function setCookie(cookie) {
        // ...
    }
    function setLanguage(lang) {
        // ...
    }
})();

这意味着它们不是全球性的。如果您希望它们是全局的,请确保它们是在顶级声明的,而不是在任何内容中声明的:

function setCookie(cookie) {
    // ...
}
function setLanguage(lang) {
    // ...
}

JavaScript不会关注函数所在的文件(除非您使用模块,但我认为您不在),所有全局变量都是真正的全局变量,而与文件无关。


我应该注意,使用全局变量通常不是最佳实践。浏览器上的全局命名空间非常很拥挤。相反,请查看各种模块捆绑器等。

答案 1 :(得分:0)

在一个文件中  localStorage.setItem('TheVariableNameYouWant',TheValueofTheVariableYouWant);

在另一个文件中 localStorage.getItem('TheVariableNameYouWant')