Javascript 此绑定返回未定义(&B)

Javascript 此绑定返回未定义(&B),javascript,Javascript,请向我解释一下,在了解这一点和bind理念时,为什么这不起作用: 变量编号={ x:'你好', y:‘老天’, z:“ohgroe”, }; 函数计算{ 计算数量; 返回这个.x+this.y+this.z; } 计算 这将仅在调用从.bind返回的函数时设置为numbers对象。它不会更改此值的本地值 我不确定在使用.bind时您最终想要的是什么,所以我不知道建议什么解决方案。请描述您试图解决的原始问题。bind返回一个函数。它不会将对象绑定到当前函数。您需要使用类似calc.bindnum

请向我解释一下,在了解这一点和bind理念时,为什么这不起作用:

变量编号={ x:'你好', y:‘老天’, z:“ohgroe”, }; 函数计算{ 计算数量; 返回这个.x+this.y+this.z; } 计算 这将仅在调用从.bind返回的函数时设置为numbers对象。它不会更改此值的本地值

我不确定在使用.bind时您最终想要的是什么,所以我不知道建议什么解决方案。请描述您试图解决的原始问题。

bind返回一个函数。它不会将对象绑定到当前函数。您需要使用类似calc.bindnumbers或calc.callnumbers的内容

这些调用需要在函数外部完成。以下是一个例子:

变量编号={ x:'你好', y:‘老天’, z:“ohgroe”, }; 函数计算{ 返回这个.x+this.y+this.z; } var结果=计算结果; //或 //var结果=计算调用数; console.logresult 您可以定义函数的预期参数,而不是在函数调用本身中设置此参数

变量编号={ x:'你好', y:‘老天’, z:“ohgroe”, }; 函数calc{x=,y=,z=}={}{ 返回x+y+z; }
console.logcalcnumbers 它的一些工作方式:

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));
然后您可以直接对n个值执行此操作:

我想放弃JS

不!不要这样做!JS是目前可用的最酷的语言之一,即使它很难学习,我保证它也是值得的

function calc() {
  calc.bind(numbers);
  return this.x + this.y + this.z;
}
这将创建一个新的“This”作用域并将calc绑定到数字。这不会执行calc,而是将数字绑定到其函数调用,这也不会将其添加到调用的This状态。你的电话现在没用了。现在如果你这样做

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;
}

首先,理解绑定、调用和应用是很重要的。所有这些都允许您控制“this”指向的对象,但它们的操作方式不同

bind返回函数的副本

调用实际上执行函数,而不仅仅是创建副本,还可以传递参数

apply与call相同,但在传入参数时使用数组

记住这一点,您可以执行以下操作:

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

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

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


您是否意识到calc.bindnumbers返回一个带有绑定参数的新函数?它不会改变就地计算。最好的解决方案是不在函数内部绑定,这毫无意义。使用calc.callnumbers。你用押韵吸引了我的注意力;如果你想了解这一点,请看一看。小心。您正在进行一个没有转义子句的递归调用。@llama您是对的,我应该更具体地说,这需要在函数之外完成。Wohoo!新手的参数对象分解@乔纳斯:为什么不呢?这个想法来自Helloreact.io。。它在关于此和绑定的教程/课程的范围内。它的思想是,除非在函数中指定了var,否则不能在函数中使用。哦,是的,这实际上是在调用端完成的。可以使用var newCalc=calc.bindnumbers创建一个新函数,该函数的this值绑定到numbers对象。因此,当你调用这个新函数时,它的值几乎总是数字。@helle-oh,这不太好:/首先尝试学习正确的js,然后继续使用react。从“反应”开始就像在你能走路之前先开车@jonas-w这只是网站的名称。这门课是为你准备的javascript@helle不,为什么他们会给它命名??第一页说本课程假设对HTML、CSS和JavaScript有一定的了解。然而,如果你已经使用这些技术中的任何一种至少几个月了,那么你在这门课程中的状态就会很好。为什么不反对呢;我认为更简洁的语法总是更好的。我想会有很多解决方案。在这种情况下,重点是学习helloreact教授的概念。很好的解释,你也教了我Object.assign方法。谢谢你,穆丘
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)