2

重複の可能性:
Javascript: 'var' を使用して変数をオプションで宣言していますか?

以下のコード例では、変数の前に var を配置すると機能しませんが、var を削除すると機能しますか? 新しい変数を作成するときは、var を使用する必要があると思いました。

function myfunction () {
    if (document.getElementById('ramyes').checked) {
      var itischecked = "yes"
    } else if (document.getElementById('ramno').checked) {
      var itischecked = "no"
    }
}   



function display () {
  myfunction()

  if (itischecked == "yes") {
    alert ("it sure is");
  } else if (itischecked == "no") {
    alert ("it is not");
  }
}
4

3 に答える 3

12

を使用するvarと、変数は現在の関数内でのみ表示されます (ローカル変数です)。var変数を最初に設定するときに使用しない場合は、すべての関数に表示されるグローバル変数が作成されます。

グローバル変数を設定するだけでグローバル変数を定義することは、ほとんどの場合ローカル変数が必要なため(この場合、グローバル変数に格納するのではなく、関数から「itischecked」値を返す必要があるため)、変数を設定するため、通常は嫌われています。なしvarは間違いのようです。これは、strict モード (誰もが常に使用する必要があるモード) のエラーでもあります。(ブラウザ) JS でグローバル変数を明示的に定義するには、グローバル スコープ (関数の外側)window.variableNameで またはを使用します。var

しかし、それを行う前に、それが良い考えかどうかを慎重に考えてください。グローバル変数が多いほど、複数のスクリプトが同じ変数名を使用するときに名前の競合が発生する可能性が高くなります。

于 2013-01-01T23:12:25.693 に答える
1

変数を作成するときに使用する必要varがありますが、2 つの関数で同じ変数を使用する場合は、両方の関数の外側のスコープで変数を作成する必要があります。

var itischecked;

function myfunction () {
  if(document.getElementById('ramyes').checked) {
    itischecked = "yes"
  } else if(document.getElementById('ramno').checked) {
    itischecked = "no"
  }
}   

function display () {
  myfunction();
  if (itischecked == "yes") {
    alert ("it sure is");
  } else if (itischecked == "no") {
    alert ("it is not");
  }
}

関数内で変数を作成すると、それはローカル変数になります。その関数内でのみ表示され、関数から戻ると消えます。


あなたの場合、変数に値を入れる代わりに、関数の戻り値を使用する必要があります。そうすれば、プログラム内でデータがどのように流れるかを追跡するのが簡単になり、グローバル変数を作成する必要がなくなります。

function myfunction () {
  if(document.getElementById('ramyes').checked) {
    return "yes"
  } else if(document.getElementById('ramno').checked) {
    return "no"
  }
}   

function display () {
  var itischecked = myfunction();
  if (itischecked == "yes") {
    alert ("it sure is");
  } else if (itischecked == "no") {
    alert ("it is not");
  }
}
于 2013-01-01T23:25:07.637 に答える
0

グローバル変数を作成しないことを示唆する前の回答に追加するだけです。作成を避けるには、何らかの方法でより大きなスコープを作成して、2 つの関数間で変数を共有できるようにする必要があります。それがvar来るところです。例えば:

function myProgramme() {
    var itischecked;

    function myfunction() {
        if (document.getElementById('ramyes').checked) {
            itischecked = "yes"
        }
        else if (document.getElementById('ramno').checked) {
            itischecked = "no"
        }
    }

    function display() {
        myfunction()
        if (itischecked == "yes") {
            alert("it sure is");
        }
        else if (itischecked == "no") {
            alert("it is not");
        }
    }
}​

(ただし、特定の例では、戻り値として単純にmyfunction渡すitischeckedことができます。)display

于 2013-01-01T23:23:23.103 に答える