QA@IT

Javascriptで、関数内で変数が未定義の時undefinedを返すようにしたい(グローバル変数をたどってほしくない)。

2380 PV

こんにちは、お世話になります。

例えば以下の様なコードで、関数内の変数bがご覧のように未定義の場合、関数はグローバル変数を探しに行ってしまいます。
これだとバグが発見しにくい気がするので、未定義の変数が関数内で使用された時に、グローバル変数を探しに行かないようにすることはできるでしょうか?

var a = 20;
var b = 10;
var obj =
   (function(){
      var a= 4;
      // var b =3; 
      return a+b;
   })();
obj; //実行結果は14

回答

print = print || console.log;
var a = 20;
var b = 10;
var obj = {
      f : function()  {
          this.a= 4;
          // this.b =3; 
          return this.a+this.b;
      }
   }.f();
print(obj); 
print(a); 

とかにすればじゃまずいんだよね?

編集 履歴 (0)
  • 回答ありがとうございます!
    まさしくこのような動作を期待していました!ありがとうございます!
    逆にこの方法で、実際に使う際なにか問題点などはあるのでしょうか?
    -
  • 自己解決しました!ありがとうございます。こういうのはいわゆる「アクセス制御」と呼ぶんですね。
    勉強になりました
    -

解決されたようですので蛇足かもしれませんが

var obj = {
      b : 10,
      f : function()  {
          this.a= 4;
          // this.b =3; 
          return this.a+this.b;
      }
   }.f();

のような場合に同じ問題が起きます。

以下のように引数にして使わないという手段もあります。
この場合も bはundefinedとなります。

var obj =
   (function(a,b){
      var a= 4;
      // var b =3; 
      return a+b;
   })();

この場合も万能かといわれればそうでもなく、利用者が引数で値を指定できてしまうので

以下のようにもう一段増やすという手もあります。
(returnを忘れずに)
ちょっと仰々しい感もありますね。

var obj = (function(){
  return (function (a,b){
      var a= 4;
      // var b =3; 
      return a+b;
  })();
})();

あとはCoffeeScriptやTypeScriptといったものを利用してグローバル変数を
回避するという手もあります。

編集 履歴 (0)
  • 御返事遅くなりました。詳しくありがとうございます!オブジェクト内でも関数・グローバル間同様、変数をたどっていってしまうんですね。そこまでは気が回っていませんでした。引数に設定する方法も私にとっては新しい発見で勉強になります!coffescriptなどでも回避できるとは知りませんでした。coffeescriptは以前から興味があったのでいずれ使ってみたいと思います。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。