2014-10-09 59 views
0

目的:我的目標是調用clientData對象的setUserName方法,使屬性:fullName設置爲適當的值。如何在不使用bind()的情況下爲另一個函數內部的函數設置「this」值?

我已經完成:我嘗試下面的代碼:

getUserInput.call(clientData,"My","Name",clientData.setUserName) 

我認爲,通過這樣做,getUserInput()函數內的this值將被設置爲我的對象clientData它做。此外,我認爲getUserInput(){}內的所有代碼都可以訪問此修改後的this值。因此,在思考過程中,我發現callback()訪問的this值也是clientData。不幸的是,callback()中的代碼仍在訪問值window。我不懂爲什麼。

我的解決方法是將setUserName綁定到clientData。有沒有另一種方法來實現我的目標而不修改clientDatagetUserInput()

var clientData = { 
    fullName: "Not Set", 
    setUserName: function (firstName, lastName) { 
     this.fullName = firstName + " " + lastName; 
    } 
}; 

function getUserInput(firstName, lastName, callback) { 
    callback(firstName, lastName); 

    } 

getUserInput("My", "Name", clientData.setUserName.bind(clientData)); 
    console.log (clientData.fullName); 
    console.log (window.fullName); 
+0

事情是,'這個'是爲每個單獨的函數調用**獨立設置的。使用'.bind()'是解決這個問題的好方法。你也可以將這個調用包裝在一個匿名函數中(這或多或少是''.bind()'爲你做的)。 – Pointy 2014-10-09 20:41:18

+1

'.bind()'不是任何形式的魔法語法。這只是一個用'this'值(和參數,如果包含一些)綁定來創建新函數的方法。它對你給它的對象沒有影響。 – 2014-10-09 20:43:04

回答

2

您的代碼實際上並不是bindgetUserInputFunction.prototype.bind()返回一個帶有綁定this值的NEW函數,並將其作爲回調參數傳遞。

相關問題