16

重複の可能性:
Javascript: オブジェクト内のすべての変数に this.var を配置する必要がありますか?

JavaScript の関数とオブジェクトを理解するのに苦労しています。関数もオブジェクトであり、オブジェクトは一種の「連想配列」、つまりキーと値のペアのコレクションであると言われています。書いたらわかる

function myFunction() {
    var value = 0;
}
alert(myFunction.value); //then this gives me "undefined"

変数には関数スコープがあるためです。でも書いたら

function myFunction() {
    this.value = 0;
}
alert(myFunction.value); //then this gives me "undefined" too.

しかし、最後に、私が書くなら

function myFunction() {
    this.value = 0;
}
myFunction.value = 0;
alert(myFunction.value); //then this gives me 0

したがって、myFunction プロパティに「値」を指定できますが、「外部」から指定できます。誰かが何が起こっているのか、なぜ this.value = 0; を説明できますか? プロパティ「値」を作成しません。

4

6 に答える 6

13

3 つのケースすべてを個別に見てみましょう。

function myFunction()
{
    var value = 0;
}

ここでは、関数のスコープで変数を宣言しています。関数が呼び出されるたびに、変数が作成されます (そしてメモリが割り当てられます)。関数が戻ると、変数はスコープ外になります。変数valueにはフラグが立てられ、GC されます。この関数のスコープより「高い」スコープからスコープにアクセスすることはできません...この関数がそのスコープ内で関数を定義した場合、その関数は変数にアクセスできますvalue(詳細についてはクロージャーを調べてください)。結論: 変数は関数が呼び出されたときのみ存在し、関数が戻った後は存在しません。

function myFunction()
{
    this.value = 0;
}

ここでは、コンストラクター、メソッド、イベント ハンドラー、または上記のすべての組み合わせである関数を定義しています。this関数が呼び出されるコンテキストを指す参照です。このコンテキストは「アドホック」と判断され、異なる場合があります。

myFunction();// global scope, this points to window
var anObject = {method: myFunction};
anObject.method();//called in the object's context, this points to object
console.log(abObject.value);//logs 0
var instance = new myFunction();//as constructor
console.log(instance.value);//logs 0
document.getElementById('anInputField').onclick = myFunction;//on click, value will be set to 0

最後のケースでは:

function myFunction()
{
    this.value = 0;
}
myFunction.value = 0;

次のように書いていれば、何の違いもありませんでした。

function myFunction()
{}
myFunction.value = 0;

上で説明したように、:this関数が呼び出された時点でのコンテキストが何であれ参照するためです。実際、これは である必要はありませんmyFunction: 多くの場合、そうではありません:

var anObject = {method: myFunction};
myFunction.value = 101;//myFunction.value is changed
anObject.method();
console.log(anObject.value);//0 -> the function still sets the value property to 0

関数内の関数のプロパティにアクセスする場合、最も簡単な方法は、他のオブジェクトと同じようにその関数を参照することです。

function myFunction()
{
    this.value = myFunction.value;
}
myFunction.value = 101;

注意:
フレンドリーな警告:thisグローバルをチェックせずに関数で使用するのはあまり安全ではありません...関数が明示的なコンテキストなしで呼び出された場合、JS はデフォルトwindowでグローバル ( ) オブジェクトを使用します。これは、たまたま指しているオブジェクトにプロパティを割り当てるすべての行が、グローバル変数を設定することを意味します。this

function myFunction()
{
    this.foo = 'bar';
}
myFunction();
console.log(window.foo);//logs bar EVIL GLOBAL

グローバルオブジェクトがグローバルで雑然とするのを防ぐいくつかの方法:

function mySafeFunction()
{
    'use strict';//throws errors, check MDN
    //this defaults to null, instead of window
    impliedGlobal = 'Error';//doesn't work
    this.onGlobal = 'Error';//null.property doesn't work
}
//same goes for constructors, but a more precise check can be used, too (and works on older browsers)
function SafeConstructor()
{
    if (!(this instanceof SafeConstructor))
    {//this doesn't point to SafeConstructor if new keyword wasn't used
        throw new Error('Constructor wasn\'t called with new keyword');
        //or "correct" the error:
        return new SafeConstructor();
    }
    console.log(this);// will always point to the SafeConstructor object
}
于 2012-11-21T19:16:34.153 に答える
7

newキーワードinstanceを使用してを作成する必要があります。

function myFunction() {
    this.value = 0;
}

var inst1 = new myFunction();

alert(inst1.value);  // this works

これは現在の object に対応し、プロパティの対応する値を取得します。

フィドルをチェック

一日の終わりに..関数はまだオブジェクトです..したがって、割り当てても文句はありません..関数の内側と外側の両方で値(キー)myFunction.value = 0を使用しているため、混乱する可能性があります..

myFunction.abc = 'Hello' 
alert(myFunction.abc) still works

ただし、まだ関数を呼び出していないため、実際の myFunction 内には反映されません。

于 2012-11-21T18:55:20.687 に答える
3

あなたはjavascriptプロトタイプ/オブジェクトの概念を誤解しました。

あなたが正しい最初の例では、変数は関数スコープを持っています

2番目の例は間違っています。関数を「クラス」として使用する場合は、そこからオブジェクトを作成する必要があります

function myFunction() { this.value = 0; }
var test = new myFunction;

そうして初めて、その「value」プロパティにアクセスできます。'new'ステートメントごとに、新しいオブジェクトが作成されます。

3番目の例では、オブジェクトを作成せずにアクセスできる静的プロパティを関数に追加します。別のテクニック

お役に立てば幸いです

于 2012-11-21T18:58:20.443 に答える
2

すべてのニュアンスを明確にできるかどうかはわかりませんが、これはいくつかの光を当てるかもしれません:

function myFunction() {
    this.value = 0;
}
alert( (new myFunction).value);

キーワードを使用すると、関数内から値を割り当てるために使用できるnew新しい「インスタンス」が作成されます。myFunctionthis

于 2012-11-21T18:55:30.550 に答える
1

myFunction関数オブジェクトです。それを渡したり、変数に割り当てたり、プロパティを割り当てたり、呼び出すことができます。

プロパティの割り当ては、他のオブジェクトと同様に機能します。

myFunction.value = 0;

ただし、この時点ではまだ関数を呼び出していないため、関数のコード(var value = 0;またはthis.value = 0;) はまだ実行されていないことに注意してください。このことを考慮:

function someFunction() {
    window.foo = 'foo'; // create a global variable
}

someFunction.bar = 'bar';

console.log(someFunction.bar); // 'bar'
console.log(window.foo); // undefined

someFunction(); // execute the function

console.log(someFunction.bar); // 'bar'
console.log(window.foo); // 'foo'

で関数を実行するとmyFunction()、ローカル変数が作成され、プロパティが on に設定されthisます。何thisを参照するかは、関数の呼び出し方法によって異なり、 MDN のドキュメントで詳しく説明されています。明示的に設定しない限り、関数自体を参照するthis ことはありません。

于 2012-11-21T19:09:27.483 に答える
1

JavaScript では、どの関数もオブジェクトであり、 のオブジェクトですFunctionNumber, Object, Array

1 つのトリッキーなことは、new関数の前にプレフィックスを付けて、新しいオブジェクトを作成し、thisその新しいオブジェクトへのキーワード ポインターを作成するという単語です (もう 1 つ、その関数プロトタイプを新しいオブジェクト __ proto __ に割り当てます)。
機能上、

this.value = 0;

新しいオブジェクトに新しいプロパティvalueを作成し、それに 0 を割り当てます。

before 関数がない 場合はnew関数呼び出しであり、Windowオブジェクトへのthisポインタになります。

console.dir(this);関数で試してみると、違いがわかります。

myFunction.value = 0;

にプロパティvalueを作成しmyFunction、それに 0 を割り当てます。myFunction は ( Functionの)単なるオブジェクトだからです。

于 2012-11-21T19:26:26.267 に答える