JavaScript中构造函数导致的不同的作用域链和标识符解析怎么理解?

发布于 2022-09-03 01:10:19 字数 161 浏览 22 评论 0

JavaScript高级程序设计中的6.2.2(p.146)中提到,构造函数模型有这样一个问题:

以这种方式创建函数,会导致不同的作用域链和标识符解析,但创建的Function新实例的新机制仍然是相同的。

这句话该如何理解呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

吾家有女初长成 2022-09-10 01:10:19

这一小节的目的是向读者说明“构造函数的方式”创建对象存在一个问题:每个方法都要在每个实力上重新创造一遍。

为什么呢?因为每通过构造函数new一个实例,构造函数中的代码就要执行一遍。对于字段属性来说,每个实例的字段本来就应该是独立的,当然没有问题;但是对于方法属性,我们是希望所有的实例是共享同一个的。

为了让读者明白为什么不同实例里面的方法是不同的,作者提醒读者不要忘了函数也是一种“对象”,是Function的实例。为了表达的更清楚,作者把方法定义从
this.sayName = function(){...}换成了this.sayName = new Function(...)。目的是让读者不要忘记函数(方法)也是对象的本质,所以每new一次都会产生不同的方法。至于你问的问题,作者是在说:我为了解释问题,把方法定义换了一种形式,这“会导致不同的作用域链和标识符解析”,但是定义函数的本质不变,即不同实例得到了不同的方法。

夜夜流光相皎洁 2022-09-10 01:10:19

我的理解是利用构造函数模式创建的实例是互不相同的,那么由构造函数产生的实例的属性也是互不相同的,虽然创建一个Function新实例的机制是一样的,但是他们已经不是在一个作用域链上了。

另外你可以从new关键字的含义上理解:

  • 创建一个空对象

  • 将空对象的__proto__指向构造函数的prototype

  • 使用空对象作为上下文调用构造函数

所以通过new Function产生的实例并不是同一个实例

昵称有卵用 2022-09-10 01:10:19

其实你可以理解为:
function test(){

return function(){};

}
var p1 = test();
var p2 = test();
var p3......
.
.
.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文