2013-11-27 49 views
-1

我以前在jQuery中发布过类似的问题,但jquery的内部处理方式this混淆不清。因此,要保持它的简单明了的考虑:javascript:“this”在内部函数

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

anObject.method(someCallbackFunction); 

是什么的“本” someCallbackFunction指向时“anObject”调用?也就是说,当一个对象(在它的一个函数内)调用函数“某个回调函数”时,什么是(内部)“某个回调函数”的“this”指向那个? [不是“this”的“外部”(AnObject.function - 当然指向AnObject或者另一个调用函数,当用call或apply调用时)]

我认为它应该指向全局对象(window object )由于this里面的一个闭包将指向全局DOM window对象(非严格模式)或者undefined(严格模式)。

+0

它取决于 - 什么是调用回调? –

+0

“对象”对象 – Tomatoes

+3

请张贴一些演示此问题的实际代码。使用你的伪代码很难分辨出你有什么问题,因为语法是非标准的。 – zzzzBov

回答

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 
+0

是的,我得到的,但当功能“一些回调函数”被一个对象(在它的一个函数内)调用,那么指向那个(内部)“某个回调函数”的“this”是什么? [不是'外部'的这个''(AnObject.function - 当然指向AnObject或另一个调用函数,当用call或apply调用时)] – Tomatoes

+0

我刚刚回答了你。它取决于''方法''方法'内调用一些回调函数的方式。就像我刚刚解释的那样:http://jsfiddle.net/ydqZ8/2/ – dooxe

+0

doxee,如果是= anObject.method(anotherObject.someCallbackFunction); – Tomatoes

0

试试这个:

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

Object.function (some callback function); 
+0

我知道你的答案有效,但我想知道'this'最初指向什么。 DOM对象与否? – Tomatoes

+0

4确定这个作品的最佳做法是_this看到https://github.com/stevekwan/best-practices/blob/master/javascript/best-practices.md – Cracker0dks

0

通常 '这个' 是指向宿主调用的方法的对象。

一个简单的例子(。您可以与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的”定义为自己的财产。)

现在有点多个嵌套:

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, []); 

因此,作为一个经验法则,“这个”是在点表示法调用对象的方法中,当最后的点之前由路径描述到最后的标识符的实体。

没有原型的最后一个例子(使它简单一点再次):

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'的上下文含义)。

我希望,这些例子了解如何“这个”工作帮助有点...

PS:如果这个对象提供了一个调用function.call()function.apply ()undefinednull,全局对象('self',在与'window'相同的浏览器中)被用作'this'。