9

私は次のようにコードを書きます、

function Myfunction(){
 Myfunction.myvar = "somevar";
}

関数を実行すると、アクセスできるようになりますMyfunction.myvar

それはどのように機能していますか?そして、そうすると、これに隠された問題は何ですか?

問題がある場合は、そのコンテキストを説明してください。

4

4 に答える 4

6

関数は呼び出されるまで実行Myfunction.myvarされないため、すぐには評価されません。

一度呼び出すと、関数定義は としてインストールされているMyfunctionため、呼び出すときに解決できます。

次のようなものは機能しません。

var x = {
       foo: 1,
       bar: x.foo } // x does not exist yet.
于 2013-07-31T10:22:58.063 に答える
5

それはどのように機能していますか?

ある実行コンテキストで関数を宣言すると、そのコンテキストの変数環境にバインディングが追加されます。識別子を参照すると、現在の変数環境がチェックされ、その識別子のバインディングが存在するかどうかが確認されます。

バインディングが存在しない場合は、外側の変数環境がチェックされ、グローバル スコープに戻ります。

そう:

// OUTER SCOPE
// Binding exists for 'example'
function example() {
    // INNER SCOPE
    // No binding for 'example'

    // References 'example' in outer scope
    example.x = 1;
}

そこに隠された問題とは?

何もありません(一般的に...それがあなたにとって正しい解決策であるかどうかは、あなたが何をしようとしているのかによって異なります)。

関数の「静的」プロパティを効果的に作成しています。JavaScript 関数は第一級であるため、他のオブジェクトと同じようにプロパティを設定できます。


関数宣言ではなく、名前付きの関数がある場合、動作が異なることに注意してください。

var x = function example () {
    // Identifier 'example' is only in scope in here
};
于 2013-07-31T10:24:12.990 に答える
0

JavaScript では、すべての関数がオブジェクトです。したがって、任意のカスタム フィールドを追加できます。

function A() {}

A.somevar = 'this is custom field';

A.prototype.somevar2 = 'this is field in A proto';

したがって、コンストラクターで新しいオブジェクトを作成すると、プロトタイプからプロパティが取得されます。

var b = new A();
alert(b.somevar2);
于 2013-07-31T10:26:33.313 に答える