2013-09-29 93 views
1

當我運行以下代碼時,警報消息顯示出來,但this.test()不運行。Javascript:onclick不會調用函數

function SomeFunction() { 
    document.onclick = function(e) { 
     alert("Hi"); 
     this.test(); 
    }; 
} 

SomeFunction.prototype.test = function(){ 
    ... 
} 

然而,當我試試這個:

function SomeFunction() { 
    document.onclick = this.test(); 
} 

SomeFunction.prototype.test = function(){ 
    ... 
} 

this.test()將運行。

編輯:我已經添加更多的細節到我的代碼。

+0

您的瀏覽器版本和瀏覽器控制檯窗口中是否有任何錯誤消息? – Teddy

+1

當你在函數中設置一個斷點,並檢查'this'的值時,它說了什麼?在調試這樣的東西時,這不是顯而易見的事嗎? – Barmar

+0

它說未定義。 – Julia

回答

1

您的問題與範圍有關。請嘗試:

document.onclick = function(e) { 
    alert("Hi"); 
    test(); 
}; 

this將根據調用的位置而有所不同。在你的第一個例子中,你是從一個匿名函數中調用它,因此this的範圍轉移到該函數中。在第二個例子中,範圍是一個較高的級別,並且指您的SomeFunction()函數。

由於您的函數嵌套在另一個函數中,因此您可能想要將this重新分配給可在作用域鏈中訪問的另一個變量。例如。

function SomeFunction() { 

    that = this; 

    document.onclick = function(e) { 
     alert("Hi"); 
     that.test(); 
    }; 
} 
+0

我試過這樣做,但它不起作用。這個函數和test()在同一個「類」中。 – Julia

+0

你可以發佈整個班級嗎 - 另一個解決方案是定義將'this'賦值給另一個變量,如果從那裏調用。 – PassKit

+0

請參閱編輯的原文。 – Julia

1

在第一個例子中,單詞「this」指的是函數本身。所以功能測試將超出其範圍。

但是在第二個例子中,你告訴代碼this.test()是實際的onclick函數,這就是爲什麼它在那裏工作而不是在第一個工作。