2017-10-12 86 views
0

我覺得放棄JS。我一直在努力與它約一個月甚至不能似乎明白爲什麼所有的突然不工作學習this &的bind想法時:這個&綁定返回undefined

var numbers = { 
 
    x: 'hi', 
 
    y: 'dawd', 
 
    z: 'ohgroe', 
 
}; 
 

 
function calc() { 
 
    calc.bind(numbers); 
 
    return this.x + this.y + this.z; 
 
} 
 

 
calc();

爲什麼這是不是返回這個簡單的計算?

+2

你一定要明白'calc.bind(數字)'返回一個新的函數綁定參數?它不會改變'calc'的位置。最好的解決方案不是綁定在函數內部,這是沒有意義的。使用'calc.call(數字)'。 – Li357

+1

你引起了我的注意與韻;) –

+0

看看[YDJS - 這和對象原型](https://github.com/getify/You-Dont-Know-JS/blob/master/this%20&% 20object%20prototypes/README.md#you-dont-know-js-this - object-prototypes)如果你想了解'this'。 –

回答

0

bind返回一個函數。它不會將對象綁定到當前函數。你需要使用類似calc.bind(numbers)()calc.call(numbers)

這些調用需要在函數之外完成。這裏有一個例子:

var numbers = { 
 
    x: 'hi', 
 
    y: 'dawd', 
 
    z: 'ohgroe', 
 
}; 
 

 
function calc() { 
 
    return this.x + this.y + this.z; 
 
} 
 

 
var result = calc.bind(numbers)(); 
 
// OR 
 
// var result = calc.call(numbers); 
 
console.log(result);

+0

要小心。你正在做一個沒有escape子句的遞歸調用。 – llama

+0

@llama你說得對,我應該更具體一些,並說這需要在功能之外完成。 – Titus

1

this將僅在調用函數.bind()返回被設置爲numbers對象。它不會改變當地的this值。

我不確定使用.bind()後最終會發生什麼,所以我不知道該如何解決問題。也許描述你正試圖解決的原始問題。

+0

這個想法來自Helloreact.io。它在關於'this'和'bind'的教程/課程的範圍內。認爲它是'this'不能在函數中使用,除非已經在裏面指定了var。 – Helle

+0

哦,是的,這實際上是在事物的調用方面完成的。你可以使用var newCalc = calc.bind(numbers)來創建一個新的函數,該函數的'this'值綁定到'numbers'對象。所以當你調用這個新函數時,'this'的值將(幾乎)總是'numbers'。 – llama

+0

@ helle哦,那樣不行:/儘量先學習正確的js,然後繼續反應。從反應開始就像開車前你可以走路;) –

0

而不是試圖設置this函數中調用本身,你可以定義預期的參數的函數

var numbers = { 
 
    x: 'hi', 
 
    y: 'dawd', 
 
    z: 'ohgroe', 
 
}; 
 

 
function calc({x = "", y = "", z = ""} = {}) { 
 
    return x + y + z; 
 
} 
 

 
console.log(calc(numbers));

+1

Wohoo!參數對象解構爲新手;) –

+1

@Jonasw爲什麼不呢?可能相等的曲線來設置'這個' – guest271314

0

有些方法可行:

function calc() { 
    return this.x + this.y + this.z; 
} 

console.log(calc.call(numbers)); 
//equals calc.bind(numbers)() 

或用

function calc(){ 
    with(numbers){ 
    return x + y + z; 
    } 
} 

console.log(calc()); 

或者通過數目使用:

function calc(nums){ 
    return nums.x + nums.y + nums.z; 
} 

console.log(calc(numbers)); 

然後你直接能做到這一點的ñ值:

fuction calc(nums){ 
    return Object.values(nums).reduce((a,b) => a + b); 
} 

console.log(calc({ 
a:1,b:4,c:5 
})); 

我覺得自己放棄了JS

不!不要這樣做! JS是目前市面上最酷的語言之一,即使它努力地學習這將是值得我答應;)

1
function calc() { 
    calc.bind(numbers); 
    return this.x + this.y + this.z; 
} 

這將創建一個新的「本」的範圍,並結合計算爲數字(這不執行calc,而是將數字綁定到它的函數調用,這不會將它添加到這個調用的狀態)。您對此的呼叫現在無所作爲。現在如果你這樣做

function calc() { 
    Object.assign(this, numbers); 
    return this.x + this.y + this.z; 
} 

X Y和Z綁定到範圍。我不知道爲什麼你會這樣做,但爲什麼你不這樣做呢?

function calc(numbers) { 
    return numbers.x + numbers.y + numbers.z; 
} 
+0

爲什麼不'Object.assign(this,numbers);'? ;) –

+1

我認爲更乾淨的語法總是更好。 –

+0

我覺得會有很多解決方案。在這種情況下,重點是要學習由helloreact傳授的概念。很好的解釋,並且你也教會了我關於'Object.assign()'方法。謝謝你 – Helle

0

首先,瞭解bind,call,apply是很重要的。所有這些都可以讓你控制'this'指向什麼對象,但是他們做的不同。

bind()返回該函數的一個副本。

呼叫()實際執行的功能而不是僅僅創建副本的和也可以被傳遞參數..

申請()是相同的呼叫(),但傳遞參數時需要的陣列。

考慮到這一點,你可以做到以下幾點:

var numbers = { 
    x: 'hi', 
    y: 'dawd', 
    z: 'ohgroe', 
}; 

function calc() { 
    return this.x + this.y + this.z; 
} 

var boundedCalc = calc.bind(numbers); 
boundedCalc(); 

calc.call(numbers); 

calc.apply(numbers)