質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • JavaScript

    16444questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

JavaScriptでのグローバル変数について

解決済

回答 5

投稿

  • 評価
  • クリップ 1
  • VIEW 748

yuuhi

score 44

グローバル変数は使わないほうが良いという記事を読みまして一つ質問があります。

以下のようにajaxで帰ってきた値をグローバル変数と比較して比較結果に応じて true か false を返し、今回帰ってきた値は次回の比較対象としたい為、グローバル変数 data_st に代入しておく。

このような場合はグローバル変数を使わずにするとなるとどうすればよいのでしょうか

data_st = '';

function ajaxResponse(response)
{
  var data = JSON.parse(response||null);
  var result = true;

  if (data_st === data) {//グローバル変数 data_st の値とajaxにより帰ってきた値が等しい場合。
      result = false;
   }

  data_st = data;//次回帰ってくる値と今回帰ってきた値を比較するため、グローバル変数 data_st に今回帰ってきた値を代入

  return result;
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+9

とりあえず手っ取り早いのは、無名関数で囲んでしまう方法です。

(function() {
  // data_stはこの無名関数の中でしか参照できない。
  // この無名関数は、ファイルを読み込んですぐに実行される。
  var data_st = '';

  function ajaxResponse(response) {
    var data = JSON.parse(response||null);
    var result = true;

    if (data_st === data) {
      result = false;
    }

    data_st = data;

    return result;
  }
})();

data_stをさらに他の場所でも使いたいのであれば、オブジェクトのプロパティとして抱えるのが良いでしょう。

var AjaxStore = {
  data_st: '',
  ajaxResponse: function(response) {
    var data = JSON.parse(response||null);
    var result = true;

    if (this.data_st === data) {
      result = false;
    }

    this.data_st = data;

    return result;
  }
};

// 何かajax処理
AjaxStore.ajaxResponse(response);

// プロパティ参照
if(AjaxStore.data_st === '100') {
  // 何か処理
}

JavaやRubyでいうクラスっぽく操作したい場合は、関数オブジェクトを利用すると良いでしょう。

function AjaxStore() {
  this.data_st = '';
}
AjaxStore.prototype.ajax = function() {
  var response = // 何かajax処理の結果

  if(this.data_st === response) {
    return false;
  }
  this.data_st = response;
  return true;
}

var store = new AjaxStore();
store.ajax();

if(store.data_st === 'test') {
  // 何か処理
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/06 21:11

    無名関数って知らなかったです恥ずかしい限りですが勉強になりましたありがとうございます(*´ڡ`●)

    キャンセル

  • 2017/02/06 22:15

    2番目の例だと、AjaxStoreがグローバル変数、3番目の例だと、store がグローバル変数で、
    > このような場合はグローバル変数を使わずにするとなるとどうすればよいのでしょうか
    に答えてないと思います。
    1番目の例が、質問目的を満たすのかはわからない。

    キャンセル

  • 2017/02/06 22:23 編集

    > otnさん
    とりあえず即時関数を使う方法を書いてから、「ついでにオブジェクトや関数の使い方も紹介しておこうかな」と考えて2,3番目も書いていましたが、ご指摘の通り質問に対する回答になっていませんね。
    「グローバル変数を使っても、こういう方法(で名前の衝突するリスクを下げる手段)もありますよ」といった一言を添えた方が正確だったかもしれません。

    キャンセル

+6

「グローバル変数を使わない方が良い」というのは手段であって、何故グローバル変数を使わない方が良いと言われるのかの理由というか目的をしっかり理解することが必要です。
目的を忘れて手段だけ丸暗記するのは駄目です。
極論を言うと、目的がちゃんと果たせていれば、手段などどうでも良い。

グローバル変数を使っていますが、topoさんの回答の2番目、3番目などが良いと思います。
この例だと、保持すべきデータが1つだけなのであまりメリットがピンと来ないかもしれませんが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

オブジェクト指向やデザインパターンを勉強してみてはいかがでしょうか。

どのような機能かご提示のコードだけではわかりませんが、大概の場合専用のClassを作って機能させます。

追記:
フレームワークやライブラリなどを使わずに、
スケーリングしない小規模なアプリケーションなどでしたらグローバル変数使っても大丈夫なんですけどね!

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/06 21:09

    今回は小規模も小規模なので大丈夫ですかね。
    でもオブジェクト指向も学んでいきたいです
    ありがとうございました(*´ڡ`●)

    キャンセル

0

適当なinputを用意しておいてデータを保持しておけばよいような

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/06 21:10

    なるほどそう言われればそういう事もできたのでした(*´ڡ`●)
    忘れてましたありがとうございました

    キャンセル

0

この実装で良いんじゃないかな
javascriptならグローバル変数にそこまで固執する必要はあまりないんじゃない?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/06 21:14


    色々と記事を読んでみて気になってしまったのですが…そうなんですか(*´ڡ`●)(゚∀゚)ありがとうございます

    キャンセル

  • 2017/02/06 21:15

    javascriptは油断するとあちこちにグローバル変数が散らばって衝突のリスクが高まるので、むしろグローバル変数には神経質になるべきだと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    16444questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。