理解しなければならないことがあり、質問を伝えるのに役立つようにプランクを作成しました。
JavaScript:
// "person" written as a plain object
var person = {
showName: function () { return this.name; },
setName: function (newName) { this.name = newName; }
};
// room is class where nested function is a lambda
var room1 = {
capacity: 10,
exits: 2,
count: 0,
person: 'this property is a String, not an Object',
addPerson: function (name) {
this.count += 1;
this.person = name;
var nestedFunction = function (name) {
this.person = name + ' name has been blown away';
}(name);
}
};
// room is class where nested function is a method
var room2 = {
capacity: 10,
exits: 2,
count: 0,
person: 'this property is a String, not an Object',
addPerson: function (name) {
this.count += 1;
this.person = name;
function nestedFunction(name) {
this.person = name + ' name has been blown away';
}(name);
}
};
HTML:
<input id="PersonObjectButton" type="submit" value="Click Me First to See Person showName Method Called"
onclick="person.setName('Dave');alert(person.showName());" /> <br />
<input id="PersonObjectButtonAwry" type="submit" value="Click Me To Blow Away Global Variable"
onclick="room1.addPerson('Alan');alert(person);" /> <br />
<input id="PersonObjectButtonFine" type="submit" value="Click Me to See Person showName Method Called"
onclick="room2.addPerson('Alan');alert(person.showName());" /> <br />
そのプランクを実行して一番上のボタンを押すと、「Steve」という名前が表示されます。難しいことは何もありません。その下のボタンをクリックすると、「アランは今ここにいます。他の名前は吹き飛ばされました」というテキストが表示されます。私はそれを理解していると思います。基本的に、room1 のnestedFunctionは関数であり、メソッドではありません。これはオブジェクトのメンバーであるメソッドではないため、Global 名前空間にあり、 person変数を吹き飛ばします (したがって、thisキーワードはroom1オブジェクトへの参照を保持しません)。
なかなか辿り着けない3つ目のボタンです。ページを更新して 3 番目のボタンをクリックすると、変数がグローバル名前空間のperson変数を吹き飛ばしていないことがわかります。その場合、thisキーワードはroom1オブジェクトへの参照を保持します。
私の質問は、ネストされているにもかかわらず、関数式として作成されていない名前付きの functionがroom2オブジェクトのメンバーになるのは何ですか? それとも、グローバル変数を吹き飛ばさないのはなぜですか?