有两种方法可以解决这个问题,一种不好的普通方法和一种好的方法,
不好的是删除var
关键字langSetting
,使其langSetting
成为全局变量。
好的是让 JSClass 返回 langSetting
或更广泛地说是一个对象来揭示它,作为一个模块愿意揭示,这被称为揭示模块模式,这是谷歌开发人员 Addy Osmani 的优秀书籍章节
在您的情况下,这是一个很好的解决方案:
var jsClass= function(){
var langSetting = "en"; // this is javascript's version of a private variable, it is 'closed' in your jsClass
var getLanguage = function(){
return langSetting;
}
var setLanguage = function(){
navigator.globalization.getPreferredLanguage(function (language){
langSetting = language.value; //set the local variable
console.log(langSetting);
}, function(){
console.log("there was an error");
});
}
return {
getLanguage:getLanguage,
setLanguage:setLanguage
};
}
然后在你的代码中你可以做
var obj = new jsClass(); // is exactly the same as var obj = jsClass , when functions return objects it doesn't matter if you use the 'new' keyword
obj.getLanguage(); //returns en
另一种解决方案是使用构造函数模式。有些人认为构造函数模式是实现 Java 开发人员迁移到 javascript 的错误,尽管它在业界和许多库中被广泛使用。这看起来如下:
function JSClass(){ //notice the capital J which though doesn't change execution is a convention indicating a class constructor
var langSetting;
this.setLanguage = function(){
//setter code here
}
this.getLanguage = function(){
//getter code here
}
}
然后使用new
关键字,它看起来像:
var myClass = new JSClass();
myClass.getLanguage();//getter result
另外,请注意我注意到您正在使用 Apache Cordova API 进行全球化,请注意这会使 setLanguage 异步,因此您可能希望它接受 a callback parameter
,这意味着您可以在完成时“挂钩”。有关回调以及如何使用它们的更多详细信息,请参阅此 stackoverflow 问题。