JavaScript代码中f.bar()、f.baz()、f.biz()返回值解析求助
三个函数调用的返回值解析
我们逐个分析代码中三个函数调用的行为:
1. f.bar() 返回 7
当用 new Foo(7) 创建实例 f 时,构造函数 Foo 内部的 this 指向新创建的实例 f。bar 是被直接赋值给 this 的箭头函数,箭头函数会捕获定义时所在作用域的变量,这里它能访问到构造函数的参数 a(值为7),所以调用 f.bar() 会返回7,你的推测是正确的。
2. f.baz() 抛出 ReferenceError
baz 是构造函数 Foo 内部用 var 声明的局部函数,作用域仅限于 Foo 函数内部,外部无法访问。尝试在 f 实例上调用 baz() 时,JavaScript 找不到这个方法,会抛出 ReferenceError: baz is not defined(具体提示依运行环境略有差异),这和你的推测一致。
3. f.biz() 抛出 TypeError
这里有两个核心问题导致报错:
- 原型赋值时机错误:
new Foo(7)创建实例f时,实例的原型链已经指向Foo原本的prototype对象;构造函数内部修改Foo.prototype的操作是在实例创建之后执行的,所以f的原型链不会更新到新的prototype对象,f本身和原型链中都找不到biz方法。 - 箭头函数的
this指向问题:就算把Foo.prototype的赋值放在构造函数外部(让实例能继承到biz),biz作为箭头函数,它的this会捕获定义时词法作用域的this——如果是在全局作用域定义,this指向全局对象(浏览器中为window),全局对象没有bar方法,调用时依然会报错。
实际运行时,调用 f.biz() 会先抛出 TypeError: f.biz is not a function,因为 f 根本不存在这个方法。
内容的提问来源于stack exchange,提问作者Beto
相关产品推荐
相关产品推荐

