var
いくつかの興味深いことをします。var
ステートメントは、その機能範囲の一番上に引き上げられます。のvar
機能範囲は、たまたま含まれる機能です。
JavaScript にはブロック レベルのスコープがありません。つまり、次のようになります。
(function () { //a closure to create new scope
var foo;
foo = 1;
if (condition) {
var bar;
bar = 3;
}
}());
...と同等です...
(function () {
var foo,
bar;
foo = 1;
if (condition) {
bar = 3;
}
}());
ステートメントに親がない場合、var
代わりに変数をプロパティとしてグローバル コンテキストに追加します。これは Web ブラウザーではたまたまwindow
.
これは、usingがプロパティを作成する唯一の場合です。var
オブジェクトのプロパティを作成する場合は、次のように設定するだけです。
(function () {
var foo;
foo = {};
foo.bar = 'baz'; //this creates the `bar` property on `foo`
}());
JavaScript は、プロトタイプ継承を持つプロトタイプ言語です。関数は第一級のオブジェクトです(JavaScript は関数に対して人種差別主義者ではないため)。これは、関数を他のオブジェクトと同じように使用できることを意味します。
それらを設定できます:
(function () {
var foo;
//foo is now a function
foo = function () {
alert('Hello World');
};
}());
それらにプロパティを設定できます。
(function () {
var foo;
foo = function () {
alert('Hello World');
};
foo.bar = 'baz'; //this works just fine
}());
それらをパラメーターとして渡すこともできます。
(function () {
var foo,
bar;
foo = function () {
alert('Hello World');
};
bar = function (c) {
c();
};
bar(foo); //guess what this does?
}());
関数が行うもう 1 つの優れた点は、コンストラクターとして機能することです。new
すべての関数は本質的にコンストラクターです。キーワードを使用して呼び出すだけです。
(function () {
var foo; //case sensitive
//it doesn't matter whether you use `function Foo`
//or `var Foo = function...`
function Foo() {
alert('Hello World');
}
foo = new Foo();
foo.bar = 'baz';
}());
コンストラクターを使用する際の重要な詳細は、関数のコンテキスト ( this
) がコンストラクターによって作成されたオブジェクトに設定されることです。これは、コンストラクター内でオブジェクトのプロパティを設定できることを意味します。
(function () {
var foo;
function Foo() {
this.bar = 'baz';
}
foo = new Foo();
alert(foo.bar); //'baz'
}());