var name = "Bob";
var book = {
name: "Harry Potter",
writeName: function() {
return function() {
document.writeln(this.book.name);
}
}
};
当我打电话给你时
book.writeName()();
我希望它能打印哈利波特(不是鲍勃),但是这个:
var book2 = book;
book = null;
book2.writeName()();
现在查找应该this.book
null
(this.book2
)
如何引用变量?
答案 0 :(得分:5)
这里你需要的是writeName
闭包中的一个变量:
var book = {
name: "Harry Potter",
writeName: function() {
var name = this.name; // turn dynamic property into closure variable
return function() {
document.writeln(name);
}
}
};
book.writeName()(); // Harry Potter
您也可以在@ Quentin的答案中存储对象的引用,而不是仅在关闭中存储name
。如果您计划在调用返回的函数之前更改.name
属性,则可能会有所不同。
有关使用this
或book
引用对象的问题,请参阅Javascript: Object Literal reference in own key's function instead of 'this'。
答案 1 :(得分:3)
由于您正在返回一个函数,因此您将失去调用生成函数的函数所获得的任何上下文。
您需要该上下文来引用该对象,因此您需要保留它。
writeName: function() {
var myBook = this;
然后您需要使用保留的上下文:
return function() {
document.writeln(myBook.name);
}
答案 2 :(得分:2)
试试这个:http://jsbin.com/pagumiwi/4/edit
var name = "Bob";
var book = {
name: "Harry Potter",
writeName: function() {
return function() {
document.writeln(this.name);
}
}()
};
book.writeName(); //would also work
var book2 = book;
book = null;
book2.writeName(); //would also work
答案 3 :(得分:1)
由于this
在上下文更改时发生更改,因此您需要保存对原始this
的引用。在这里,我使用了_this
var book = {
name: "Harry Potter",
writeName: function() {
var _this = this;
return function() {
console.log(_this.name);
}
}
};
book.writeName()() // Harry Potter
var book2 = book;
book = null;
book2.writeName()(); // Harry Potter