2012-11-22 49 views
1

一個功能,我創建了以下對象:執行給出一個變量

function Calculator() { 
    //some code here, including object variables and functions, such as: 
    this.add = function(x) { 
     //again, irrelevant code 
    } 
    //similar methods 
} 


var calc = new Calculator(); 

然後,我試着做到以下幾點:

var met = calc.add; 
met(5); 

但沒有奏效。 (我已經檢查了所有 - 變量'met'是類型'function',當我「警告」它是確定的時,它會提示正確的字符串 - function(x){...}等。但是調用met(7)會什麼都沒有,同時呼籲calc.add(7)增加數)

有誰知道爲什麼,要不我怎麼能解決這個問題? (我能解決這個問題?)

+2

您_say_的'add'方法是無關緊要的,但爲了安全起見函數體:你能包括它無論如何呢?如果你正在訪問閉包變量或對象屬性,那麼這就是你的問題......無論如何,你調用方法的方式確實意味着該方法依賴於對象的其他屬性 –

+0

這可能是一個範圍界定問題(http: //stackoverflow.com/questions/3127429/javascript-this-keyword)。發佈一些實際的代碼。 –

+0

適合我。 –

回答

1

其實,裏面add功能不無關係。你遇到的問題是,因爲如何this在JavaScript行爲。

當你這樣稱呼它:

met(5); 

它一樣做這樣的:

window.met(5); // assuming browsers 

這意味着在滿足this被綁定到全局對象。所以它不起作用的原因是因爲你試圖添加的變量不存在於全局對象中。你可以簡單地通過聲明的全局對象變量(這對於瀏覽器碰巧是全局變量)測試:

var foo = { 
    i = 0, 
    incr = function(){ return ++this.i } 
} 
foo.incr(); // this works as expected 

// now assign foo.incr to the global object: 
var inc = foo.incr; 
inc(); // this fails because window.i doesn't exist 

// create i in window 
i =0; 
inc(); // now this works, maybe a bit unexpected 

如果你想簡單的別名addmet,但你有兩個calc對象上仍然運行選項。首先是確保add被稱爲的calc方法:

var met = function(x) { return calc.add(x) }; 
met(5); 

這是簡單,它按預期工作。通過增加一個匿名函數包裝,我們可以調用add作爲calc.add()這使得this綁定到鈣。

二是由@Guffa提到:使用電話或適用於點this到任何你想要的:

var met = calc.add; 
met.call(calc,5); 

要了解更多關於this作品在JavaScript如何閱讀:How does the "this" keyword in Javascript act within an object literal?

+0

在現代瀏覽器中,使met成爲calc.add的一種稍微簡單的方法是var met = calc.add.bind(calc);''。另一個選項(儘管我不喜歡它)是定義this.add,以便內部它不使用它,但使用其他一些變量,如'mycalc',它被關閉 - 即超過this.add的定義在構造函數中,你會寫''var mycalc = this;'',然後在任何你想引用這個內部add的地方,改用mycalc。這不是定義對象的好方法,但可以讓您輕鬆地將它們作爲函數傳遞,而不用擔心它們從對象中分離出來。 – kybernetikos

0

當你到一個方法的引用,你剛纔得到的功能,它沒有連接到對象的任何更多。如果你調用該函數,this沒有loger對象的引用,它是全球window對象,這就是爲什麼在函數的代碼將不再有效。

爲了把它作爲一種方法,你需要撥打電話說明它應作爲對象的方法運行:

met.call(calc, 5); 
0

它的工作原理。你沒有認爲自己有問題。

function Calculator() { 
    //some code here, including object variables and functions, such as: 
    this.add = function(x) { 
     alert('bob'); 
    } 
    //similar methods 
} 

var met = new Calculator().add; 

met();//'bob' 

您可能會遇到其他人提出的某種範圍問題。 met應該有權訪問在add方法之上建立的任何var。

0

什麼你必須記住的是,每次調用一個函數時,就好像這個是一個隱藏參數,而不是當你調用函數並保存在函數閉包中時設置的東西。

當你調用滿足(5)以下將輸出到控制檯:

function Calculator() { 
    y = 10; // set variable 

    this.add = function(x) { 
     console.log(this.y); // => undefined as window object does not have y 
     console.log(y); // => 10 as function can access parent function's closure 

     function printY() { 
      console.log(y); // => undefined as this function can only access parent function's closure and that does not contain a y variable. 
     } 
    } 
} 
相關問題