javascript:内部函数中的“this”

时间:2013-11-27 15:09:00

标签: javascript

我之前在jquery的上下文中发布了一个类似的问题,但是jquery对this混淆问题的内在处理。所以要保持简单明了的考虑:

function someCallbackFunction() {
    this.name = "Tom";
}

anObject.method(someCallbackFunction);

“anObject”调用时someCallbackFunction指向的“this”是什么?

也就是说,当一个对象(在其中一个函数中)调用函数“some call function”时,(内部)“某些回调函数”的“this”是什么指向那个? [不是“外部”的“this”(AnObject.function - 当然通过调用或应用调用时指向AnObject或其他调用函数)]

我认为它应该指向全局对象(window对象),因为闭包内的this将指向全局DOM window对象(在非严格模式下)或者是undefined(严格模式)。

3 个答案:

答案 0 :(得分:1)

this取决于函数的调用方式。 如果您将其称为mycallback()this将引用window对象。 如果您通过mycallback.call(object)(或apply)进行调用,则this会引用object

http://jsfiddle.net/ydqZ8/1/

function callback()
{    
    alert(this.toto);
}

window.toto = 0;
var obj = {
    toto : "TOTO" 
};

callback(); // displays 0
callback.call(obj);    // displays TOTO

答案 1 :(得分:0)

试试这个:

var self = this;
some callback function () {
    self.name = "Tom";
}

Object.function (some callback function);

答案 2 :(得分:0)

通常'this'指向托管方法的对象。 (您可以通过 function.call(thisObject,arg1,arg2) function.apply(thisObject,[argList])覆盖它。)

一个简单的例子:

var myObject = {
  value: 1,
  report: function() {
    return "value: " + this.value;
  }
}

console.log( myObject.report() ); // "value: 1"

应该很清楚。

使用构造函数和原型,它将是:

function Reporter(v) {
  this.value = v;
}

Reporter.prototype = {
  report: function() { return "value: " + this.value; }
};

var myObject = new Reporter(1);
console.log( myObject.report() ); // "value: 1"

工作原理相同。 'this'是通过调用“new Reporter(1)”创建的对象,原型中的'this'指的是调用方法“report()”的对象。 (如果“myObject”中没有将“report()”定义为自己的属性,原型只会发挥作用。)

现在有点嵌套:

function ComplexReporter(v) {
  this.value = v;
}

ComplexReporter.prototype = {
  report: function() { return "value: " + this.value; },
  utils: {
    innerReport: function() { return "value: " + this.value; }
  }
};

var myObject = new ComplexReporter(1);
console.log( myObject.report() ); // "value: 1"
console.log( myObject.utils.innerReport() ); // "value: undefined"

第一个电话如上所述,并提供预期结果。

在第二次调用中,'this'不是预期的'myObject',而是'myObject.prototype.utils',它没有任何类型的属性@value。 这实际上是

ComplexReporter.prototype.utils.innerReport.apply( myObject.prototype.utils, [] );

因此,根据经验,'this'是在以点表示法调用对象方法时,最后一个点之前的最后一个标识符的路径所描述的实体。

没有原型的最后一个例子(为了使它更简单一点):

var myComplexObject = {
  value: 1,
  report: function() {
    return "value: " + this.value;
  },
  utils: {
    innerReport: function() {
      return "value: " + this.value;
    }
  }
}

console.log( myComplexObject.report() ); // "value: 1"
console.log( myComplexObject.utils.innerReport() ); // "value: undefined"
// same as myComplexObject.utils.innerReport.apply( myComplexObject.utils, [] );
console.log( myComplexObject.utils.innerReport.apply( myComplexObject, [] ) ); // "value: 1"

:'this'总是在当下被评估,函数被调用(因此在构造闭包时你不能保存'this'的上下文含义)。

我希望,这些例子有助于理解“这个”是如何运作的......

PS:如果提供对 function.call() function.apply()的调用的this-object是 undefined null ,全局对象('self',在浏览器中与'window'相同)用作'this'。