2013-11-27 105 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'。