Javascript这和回调

时间:2017-06-25 06:57:23

标签: javascript this

使用var that = this进行回调时,为什么回调函数必须是function() {that.myFn()}而不是that.myFn

例如:

var obj = {

  foo: function(fn) {
    console.log('--foo--', this);
    fn();
  },

  bar: function() {
    console.log('--bar--', this);
  },

  render: function() {
    var that = this;

    // this line works
    this.foo( function() {that.bar()} );

    // this line doesn't work
    this.foo(that.bar);
  }

}

obj.render()

3 个答案:

答案 0 :(得分:2)

原因是因为CreditCardbar.call(that)相同,但CreditCardthat.bar()相同,而in loose mode, undefined becomes the global context则是fn() {1}}。

答案 1 :(得分:2)

等属性上调用函数时
myObject.myFunction();

它会自动将this值绑定到该对象,而只需获取对该函数对象的引用,如下所示:

var x = myObject.myFunction;
x();

并不意味着任何“这个”。第一个语句只是将x设置为与myObject的该属性引用的函数相同的函数。

将其包装在类似的函数中:

var x = function(){ myObject.myFunction()};
x();

调用myFunction,myObject绑定到“this”。

您也可以使用javascript Function.prototype函数“call”,“apply”和“bind”,如下所示:

var x = myObject.myFunction.bind(myObject, parameterOneIfAny);
x();

返回一个具有显式绑定“this”值“myObject”的函数。它只是javascript函数系统的一部分,在你没有设置this的情况下,函数对象不会将“this”上下文(或者默认this保存到环境“global”对象中)除非使用属性语法object.function()调用或使用object.function.bind(object)

明确绑定

最后,如果您使用{/ 1}}调用任何函数引用,如

new

var x = myObject.myFunction.bind(myObject, parameterOneIfAny); var y = new x(); 被实例化为一个新对象,并作为返回值传递,这是javascript的假“类”语法的基础。所以在这种情况下,x被作为构造函数调用,并返回其this值,使y为'new'x。

最后,如果您尝试在未使用this上下文调用的函数中使用this,则javascript strict模式将调用您,而不是默认的非严格行为{{ 1}}到this对象。

答案 2 :(得分:-1)

正如@slackOverflow所说。这里有一个有助于理解的链接 https://developer.mozilla.org/de/docs/Web/JavaScript/Referen‌ce/Operators/this

或试试这个。这个帖子很有帮助。 http://ryanmorr.com/understanding-scope-and-context-in-javas‌​cript