0

我对以下代码打印出“this.text”有疑问。

我需要一个包装器功能才能使其工作。这太麻烦了。

有没有更简单的方法(没有额外的包装器)让它工作?

  function Class1() {
    this.text = "test";
  }

  Class1.prototype.show = function() {
    console.log(this);
    console.log(this.text);
  }

  var testClass = new Class1();

  function funWithCallBack(cb) {
    cb();
  }

  // it will show "undefined" because "this" scope changes to window
  funWithCallBack(testClass.show); 

  function wrapper() {
    testClass.show();
  }

  // this one will work but troublesome
  funWithCallBack(wrapper)
4

1 回答 1

3

您可以使用这样的匿名函数:

// it will show "undefined" because "this" scope changes to window
funWithCallBack(testClass.show); 

对此:

// anonymous function to use the right object for the method
funWithCallBack(function() {
    testClass.show()
}); 

出现您的问题是因为当您testClass.show作为回调传递时,它只是获取函数引用并且不再有testClass任何关联。但是,您可以使用 来创建一个将它们绑定在一起的临时函数 .bind(),但某些旧浏览器不支持它,这就是为什么我通常只使用匿名函数的原因。

.bind()实现如下所示:

// use .bind() to make sure the method is called in the right object context
funWithCallBack(testClass.show.bind(testClass)); 
于 2013-02-24T04:51:50.290 回答