有些事情我需要了解,我已经完成了一些工作以帮助传达我的问题。
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 />
如果您运行该 plunk 并点击顶部按钮,它会显示名称“Steve”。那里没什么难的。当你点击下面的按钮时,它会显示文本“艾伦现在在这里。其他名字已经被吹走了。” 我想我明白这一点。基本上, room1 中的nestedFunction是一个函数而不是方法。因为它不是任何对象的成员的方法,所以它位于 Global 命名空间中,它会清除person变量(因此,this关键字不包含对room1的引用对象的引用)。
这是我不太关注的第三个按钮。如果刷新页面并单击第 3 个按钮,您会看到该变量不会吹走 Global 命名空间中的person变量。在这种情况下,this关键字确实包含对room1的引用对象的引用。
我的问题是,尽管是嵌套的,但不是作为函数表达式创建的命名函数使它成为room2对象的成员,它是什么?或者甚至只是为什么它不吹走全局变量?