これを解決するには、よくある悪い方法と良い方法の 2 つの方法があります。
悪いのは、それをグローバル変数にするvar
キーワードを削除することです。langSetting
langSetting
良いのは、JSClass が langSetting
何を明らかにするか、より広くオブジェクトを返すようにすることです。これは、モジュールが明らかにしようとしているときに、明らかにするモジュール パターンと呼ばれます。これは、Google 開発者の 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
別の解決策は、コンストラクタ パターンを使用することです。コンストラクター パターンは、業界や多くのライブラリで広く使用されていますが、javascript に移行する Java 開発者を実装するために犯した間違いであると考える人もいます。これは次のようになります。
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 を非同期にすることに注意してください。そのため、callback parameter
完了時に「フック」することを意味する a を受け入れるようにしたい場合があります。コールバックとその使用方法の詳細については、このスタックオーバーフローの質問を参照してください。