Javascript范围和变量

时间:2014-02-17 13:18:40

标签: javascript variables scope

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

nullthis.book2

如何引用变量?

4 个答案:

答案 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属性,则可能会有所不同。

有关使用thisbook引用对象的问题,请参阅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

Demo