7

これらの違いは何ですか?

var a = 13;  
this.b = 21;  
document.write(a);  
document.write(b);
4

2 に答える 2

19

グローバル コード (関数の一部ではないコード) の場合、それらはほぼ同等であり、最後にグローバル オブジェクトのプロパティを作成します。

違いは、ステートメントでa宣言されている、変数のインスタンス化プロセスがグローバル オブジェクトを変数オブジェクト(1)として使用し、そのプロパティを削除不可として定義することです。次に例を示します。var

var a = 13;
delete a; // false
typeof a; // "number"

次に、グローバル コードbthis値はグローバル オブジェクト自体を指すため、グローバル プロパティにもなりますが、これは削除できます。

this.b = 21;
delete b; // true
typeof b; // "undefined"

Firebug のコンソールは を使用してコードを内部的に実行するため、Firebug で最初のスニペットを試さないでください。evalこの実行コンテキストでは、変数のインスタンス化プロセスの動作が異なります。ここで試すことができます。

(1)変数オブジェクト (VO) は、関数宣言の識別子、varステートメントで宣言された識別子、および関数の仮パラメーターの識別子を定義するために変数のインスタンス化プロセスによって使用されるオブジェクトであり、さまざまな実行コンテキストで、これらすべての識別子はVO のプロパティとしてバインドされているため、スコープ チェーンは VO のリストで形成されます。

グローバル コードの場合、VO はグローバル オブジェクトそのものです。そのため、aends はそのプロパティです。関数コードの場合、VO ( FunctionCodeのアクティベーション オブジェクトとも呼ばれます) は、関数を呼び出すときに舞台裏で作成される新しいオブジェクトであり、それが新しいレキシカル スコープを作成するものです。つまり、関数について説明します。 .

スコープ チェーンの最初のオブジェクトが再びグローバル オブジェクトであるため、とaの両方が簡単に解決this.bできます。ab

また、変数のインスタンス化プロセスがコード実行よりも前に行われることを知っている作業だと思います。たとえば、次のようになります。

alert(a); // undefined, it exists but has no value assigned to it yet
alert(b); // ReferenceError is thrown

var a = 13;
this.b = 21;

これらの違いは些細なことかもしれませんが、知っておく価値はあると思います。

さて、あなたが投稿したコードスニペットが関数内にある場合、それは完全に異なります.

例のステートメントで宣言されたa識別子は、関数 (およびネストされた関数) のレキシカル スコープでのみ使用できるローカル変数になります。var

JavaScript ブロックでは新しいスコープを導入せず、関数のみが導入することに注意してください。そのスコープで変数を宣言するには、常に を使用する必要がありますvar

識別子はthis.b、値によって参照されるオブジェクトにバインドされたプロパティになりますthisが... ???とは何ですか? this.

JavaScriptのthis値は、関数を呼び出すときに暗黙的に設定されます。関数を呼び出す方法によって決まります。

  1. new演算子を使用するthisと、関数内の値は、新しく作成されたオブジェクトを指します。たとえば、次のようになります。

    function Test() {
      this.foo = "bar";
    }
    var obj = new Test(); // a new object with a `foo` property
    
  2. オブジェクトのメンバーである関数を呼び出すと、その関数内の値はベース オブジェクトthisを指します。例:

    var obj = {
      foo: function () {
        return this == obj;
      }
    };
    obj.foo(); // true
    
  3. ベース オブジェクトなしで関数を呼び出すと、this値はグローバル オブジェクトを参照します。

    function test() {
      return this == window;
    }
    test(); // true
    
  4. またはを使用して関数を呼び出すと、this値を明示的に設定できます。callapply

    function test() {
      alert(this);
    }
    test.call("hello world!"); // alerts "hello world!"
    
于 2010-06-25T07:04:23.707 に答える
1

つまり、これらを関数で使用すると、

this.a; //will create a public property

var b; //will create a member variable

たとえば、これはjavascriptのStudentクラスです

var Student = function()
{
    // Member variable
    var studentId;

    // Public property
    this.Name = "";
}

詳細については、JavaScript を使用したオブジェクト指向プログラミングを参照してください。

于 2010-06-25T07:00:53.230 に答える