2017-10-12 78 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)