此 JavaScript 代码为 bar、baz 和 biz 函数调用返回什么?

What does this JavaScript code return for bar, baz, and biz function calls?

提问人:Beto 提问时间:7/21/2022 最后编辑:ReynoBeto 更新时间:7/21/2022 访问量:127

问:

学习 JavaScript 基础知识,对函数调用的返回内容感到困惑。 我有一个想法 f.bar 返回 7,因为当创建 f 对象时,它可以访问具有“this”关键字的 Foo 函数。此外,我相信 f.baz 返回错误,因为此函数仅在本地可用,并且不使用“this”关键字,这使得它在 Foo 之外不可用。f.biz 我很困惑,但我知道 Prototype 关键字允许继承 Foo 属性。

每个函数调用的解释会很棒,谢谢大家!

var Foo = function(a){

  this.bar = () => {
    return a; 
  }

  var baz = function(){
    return a;
  }

  Foo.prototype = {
    biz: () => {
      return this.bar();
    }
  }

}

var f = new Foo(7);

f.bar();// what does this return?
f.baz(); // what does this return?
f.biz(); // what does this return?

javascript 这个 原型

评论

6赞 Reyno 7/21/2022
如果你想知道返回值,只需将调用包装在一个console.log() -> console.log(f.bar());
3赞 trincot 7/21/2022
如果这是在课程中提供的,请扔掉该课程。里面不应该有.它应该出现在 的定义之后Foo.prototype =FooFoo
1赞 trincot 7/21/2022
“对每个功能的解释会很棒”:这太宽泛了。目前尚不清楚需要解释什么。请将您的问题集中在您遇到的一个具体问题上。
0赞 Beto 7/21/2022
这是一位朋友在采访中提出的一个问题。

答:

1赞 FZs 7/21/2022 #1

就像现在一样,只有该函数才能按预期工作。bar

该函数位于局部变量中,因此它只能在函数内部访问,而不能作为(变量和实例属性 () 未以任何方式连接)。bazFoobazthis.bazthis.whatever

的情况有点复杂。通常,这或多或少是你创建原型方法的方式,但你在错误的地方做了。它应该在函数之外,因为现在的方式是:biz

  • 每次调用时重新分配(不必要)new Foo()
  • 仅在创建当前实例分配,因此它只会在下一个实例上生效(如果您在其中使用(您不应该使用),您会发现它始终具有上一个调用)aa

当你想“让JS设置”时,你也不想使用箭头函数(箭头函数从定义它们的地方复制它们)。thisthis

所以,要制作工作,你必须这样做:biz

var Foo = function(a){

  this.bar = () => {
    return a; 
  }

}

Foo.prototype = {
  biz: function (){
    return this.bar();
  }
}


var f = new Foo(7);

console.log(f.bar());
console.log(f.biz());