クロージャに関係しているときに関数をグローバルにしようとすると問題が発生します。以下にリストされているコードには、window
で呼び出されるgetNameField
の新しい関数を定義する匿名メソッドがあります。
(function () {
function alertError (msg) {
alert(msg);
}
window.getNameField = function (fieldId) {
try{
if(!fieldId) {
fieldId='name';
}
return document.getElementById(fieldId);
} catch(e) {
alertError(e);
}
};
}());
alert(getNameField().value);
これはブラウザではうまく機能しますが、「未定義の変数を許可しない」をオンにして JSLint.com でコードを実行すると、エラーが発生します。
17行目の7文字目の問題: '
getNameField
'が定義されていません。
JSLintがこの関数をグローバルと見なす必要があることを実際に理解できるように、これを修正するのを手伝ってもらえますか?
代わりに、window.getNameField
と呼ぶことができます。
alert(window.getNameField().value);
または、クロージャーの外側で変数を定義することもできます。
var getNameField;
(function(){
getNameField=function(fieldId){
// Code here...
};
}());
alert(getNameField().value);
やってみます
window["getNameField"] = function(fieldId) {
JSLintは、この目的のために注釈付きのコメントを取ります。 /*global */
コメントの使用について ここ を読んでください。