web-dev-qa-db-ja.com

ReferenceError:変数が定義されていません

私は時々この問題に出会いましたが、それが何が原因なのかまだわかりません。

このスクリプトはページにあります:

$(function(){
    var value = "10";
});

しかし、ブラウザーには「ReferenceError:value is not defined」と表示されます。ただし、ブラウザコンソールに移動して次のいずれかを入力すると

10

または

var value = "10";

どちらも10を返すことができます。スクリプトの問題は何ですか?

編集:「var」を取り除くだけで問題を解決できます。

24
Andrew Liu

クロージャ内で宣言されているため、そこにしかアクセスできません。グローバルにアクセス可能な変数が必要な場合は、varを削除できます。

$(function(){
    value = "10";
});
value; // "10"

これは、window.value = "10";

33
McGarnagle

変数は、定義したスコープ内でのみ使用できます。関数内で変数を定義すると、その変数の外部からアクセスできなくなります。

関数の外側(そしてもちろんその前)でvarを使用して変数を定義し、関数内で_10_を割り当てます:

_var value;
$(function() {
  value = "10";
});
console.log(value); // 10
_

このコードの最初の行(_var value;_)を省略しないでください。そうしないと、未定義の変数に値を割り当てることになります。これはコーディングの習慣が悪く、厳格モードでは機能しません。変数(_var variable;_)の定義と変数(_variable = value;_)への値の割り当ては、2つの異なるものです。定義していない変数に値を割り当てることはできません。

ここでは関係ないかもしれませんが、$(function() {})$(document).ready(function() {})のショートカットで、ドキュメントが読み込まれるとすぐに関数を実行します。すぐに実行したい場合は必要ありません。そうでない場合は、DOMがロードされる前に実行すると、ロードされるまで値がundefinedになるため、console.log(value);が配置されます。 $(function() {})の直後はundefinedを返します。つまり、次の順序で実行されます。

_var value;
console.log(value);
value = "10";
_

こちらもご覧ください:

次のコードでエラーを取得しました(関数initで)。

"use strict" ;

var hdr ;

function init(){ // called on load
    hdr = document.getElementById("hdr");
}

...サムスンギャラクシーフェイム(優れたテスターに​​なっているがらくた電話)でストックブラウザを使用している間-userAgent; Mozilla/5.0(Linux; U; Android 4.1.2; en-gb; GT-S6810P Build/JZO54K)AppleWebKit/534.30(KHTML、Geckoなど)バージョン/4.0 Mobile Safari/534.30

同じコードは、古いHTC電話のuserBrowserを含む、私が試した他のすべての場所で機能します。 Mozilla/5.0(Linux; U; Android 2.3.5; en-gb; HTC_WildfireS_A510e Build/GRJ90)AppleWebKit/533.1(KHTML、Geckoなど)バージョン/4.0 Mobile Safari/533.1

これに対する修正は変更することでした

var hdr ;

var hdr = null ;
1
Bob