これらの違いは何ですか?
var a = 13;
this.b = 21;
document.write(a);
document.write(b);
これらの違いは何ですか?
var a = 13;
this.b = 21;
document.write(a);
document.write(b);
グローバル コード (関数の一部ではないコード) の場合、それらはほぼ同等であり、最後にグローバル オブジェクトのプロパティを作成します。
違いは、ステートメントでa
宣言されている、変数のインスタンス化プロセスがグローバル オブジェクトを変数オブジェクト(1)として使用し、そのプロパティを削除不可として定義することです。次に例を示します。var
var a = 13;
delete a; // false
typeof a; // "number"
次に、グローバル コードb
のthis
値はグローバル オブジェクト自体を指すため、グローバル プロパティにもなりますが、これは削除できます。
this.b = 21;
delete b; // true
typeof b; // "undefined"
Firebug のコンソールは を使用してコードを内部的に実行するため、Firebug で最初のスニペットを試さないでください。eval
この実行コンテキストでは、変数のインスタンス化プロセスの動作が異なります。ここで試すことができます。
(1)変数オブジェクト (VO) は、関数宣言の識別子、var
ステートメントで宣言された識別子、および関数の仮パラメーターの識別子を定義するために変数のインスタンス化プロセスによって使用されるオブジェクトであり、さまざまな実行コンテキストで、これらすべての識別子はVO のプロパティとしてバインドされているため、スコープ チェーンは VO のリストで形成されます。
グローバル コードの場合、VO はグローバル オブジェクトそのものです。そのため、a
ends はそのプロパティです。関数コードの場合、VO ( FunctionCodeのアクティベーション オブジェクトとも呼ばれます) は、関数を呼び出すときに舞台裏で作成される新しいオブジェクトであり、それが新しいレキシカル スコープを作成するものです。つまり、関数について説明します。 .
スコープ チェーンの最初のオブジェクトが再びグローバル オブジェクトであるため、とa
の両方が簡単に解決this.b
できます。a
b
また、変数のインスタンス化プロセスがコード実行よりも前に行われることを知っている作業だと思います。たとえば、次のようになります。
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
値は、関数を呼び出すときに暗黙的に設定されます。関数を呼び出す方法によって決まります。
new
演算子を使用するthis
と、関数内の値は、新しく作成されたオブジェクトを指します。たとえば、次のようになります。
function Test() {
this.foo = "bar";
}
var obj = new Test(); // a new object with a `foo` property
オブジェクトのメンバーである関数を呼び出すと、その関数内の値はベース オブジェクトthis
を指します。例:
var obj = {
foo: function () {
return this == obj;
}
};
obj.foo(); // true
ベース オブジェクトなしで関数を呼び出すと、this
値はグローバル オブジェクトを参照します。
function test() {
return this == window;
}
test(); // true
またはを使用して関数を呼び出すと、this
値を明示的に設定できます。call
apply
function test() {
alert(this);
}
test.call("hello world!"); // alerts "hello world!"
つまり、これらを関数で使用すると、
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 = "";
}