私は次のようにコードを書きます、
function Myfunction(){
Myfunction.myvar = "somevar";
}
関数を実行すると、アクセスできるようになりますMyfunction.myvar
それはどのように機能していますか?そして、そうすると、これに隠された問題は何ですか?
問題がある場合は、そのコンテキストを説明してください。
私は次のようにコードを書きます、
function Myfunction(){
Myfunction.myvar = "somevar";
}
関数を実行すると、アクセスできるようになりますMyfunction.myvar
それはどのように機能していますか?そして、そうすると、これに隠された問題は何ですか?
問題がある場合は、そのコンテキストを説明してください。
関数は呼び出されるまで実行Myfunction.myvar
されないため、すぐには評価されません。
一度呼び出すと、関数定義は としてインストールされているMyfunction
ため、呼び出すときに解決できます。
次のようなものは機能しません。
var x = {
foo: 1,
bar: x.foo } // x does not exist yet.
それはどのように機能していますか?
ある実行コンテキストで関数を宣言すると、そのコンテキストの変数環境にバインディングが追加されます。識別子を参照すると、現在の変数環境がチェックされ、その識別子のバインディングが存在するかどうかが確認されます。
バインディングが存在しない場合は、外側の変数環境がチェックされ、グローバル スコープに戻ります。
そう:
// 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
};
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);