2013-07-08 35 views
3

方面也有一些是我不明白的JavaScript砸開一個樣本問題的基本情況:繞過功能包括其在JavaScript

a = function() { 
     this.b = 5; 
    } 

    a.prototype.c = function() { 
     alert(this.b); 
    } 

    var d = new a(); 
    var e = d.c; // how do I save a ref to the method including the context (object)?? 

    d.c(); // 5 -> ok 
    e(); // undefined -> wtf?? 

那麼,爲什麼被調用的函數沒有它的上下文最後一個例子?我怎樣才能在上下文中調用它?

預先感謝:-)

回答

5

d.c就像是一個未結合的實例方法。您可以使用Function.prototype.bind創建綁定到d新功能(第一個參數.bindthis參數):

var e = d.c.bind(d); 

或致電ed作爲this參數:

e.call(d); 
2

你需要使用對象調用方法來獲取正確的上下文。所以:

var e = function() { return d.c(); }; 

在新的瀏覽器可以使用bind method做同樣的:

var e = d.c.bind(d); 

在jQuery中,例如存在proxy method,你可以在舊的瀏覽器也使用:

var e = $.proxy(d.c, d); 
1

這是關於解決this價值。這是通過以下方式解決:

myObject.something();//this in something is myObject 
window.something();//this is window 
button.onClick=function();//this when button is clicked is button 

如何解決它已經給出,它使用的setTimeout

var test = function() { 
    var me = this;// set reference to this 
    this.sayAgain=function(){ 
    console.log("Hi, I am "+me.toString()); 
    } 
} 
test.prototype.toString=function(){ 
    return "test"; 
} 

test.prototype.say = function() { 
    console.log("Hi, I am "+this.toString()); 
} 

var t = new test(); 
setTimeout(t.say,50);//=window passing functon without ref to this 
setTimeout(function(){ 
    t.say(); 
},150);//=test passing ref with function 
setTimeout(t.sayAgain,200);//=test using me as the saved this context 

第二種超時傳遞一個closure在下面的例子中傳遞迴調像一個常見的錯誤setTimeout,如果你打算通過說回調數百次,但只創建了幾個測試對象實例,那麼最後一個(sayAgain)的執行會稍微好一些。

這是因爲您在創建測試實例時創建閉包,但在傳遞sayAgain作爲回調時不會創建封閉,如果創建了很多測試實例並且不會多次傳遞say,那麼請將this.me和this.sayAgain從功能體並通過say作爲封閉。

您可以使用Function.prototype.bind,但它不支持在IE < 8中,我不確定它是否會像我的示例中使用t.say那樣創建閉包。