为什么每次调用函数时Javascript引擎都需要创建一个激活对象?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么每次调用函数时Javascript引擎都需要创建一个激活对象?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1496字,纯文字阅读大概需要3分钟。
内容图文
总结范围链的概念:
加载网页后,Javascript会定位函数定义并为每个网页创建一个所谓的变量对象.
每个VO必须引用每个局部变量(或全局),因此从第一个祖先的函数开始直到全局上下文.
每个函数的作用域链都存储在名为Scope的函数属性中.
此外,在调用函数时,会创建一个新对象:激活对象.
这是什么? :
它就像一个变量对象(实际上是一个VO),负责引用所有函数内部的变量对象,包括“arguments”对象和形式参数.
当然,每个函数祖先的变量对象函数的激活对象组成的链都首先将至少所有变量映射到未定义.然后,只要执行进行,它就会通过更新其值(对应于引用的变量)而发展.
但是,我注意到Activation Object与变量对象的不同之处仅在于它包含Arguments对象,并且这个事实会阻止它在调用函数之前创建.
所以,我想知道为什么构建Javascript引擎的人没有在函数的定义步骤中分配每个激活对象.因此,当调用函数时,不需要创建自己的特定激活对象,因为它已经存在.引擎只会在函数执行结束时清除相应的arguments对象,以便下一次调用此对象时可以没有副作用.
它可能会提高性能吗?实际上,在每次调用时重新创建一个完整的激活对象可能会消耗..或者这个提议有问题吗?
解决方法:
激活对象表示函数调用的上下文.每次调用都必须有自己的对象.它们允许关闭等.
可以认为它类似于为C或C函数调用而分配的堆栈帧.
编辑 – 这是一个示例函数:
function makeCounter( count ) {
return function() {
return count++;
};
}
现在,我可以用它来制作一个反函数:
var counter1 = makeCounter(1);
alert(counter1()); // alerts "1"
alert(counter1()); // alerts "2"
如果我再制作一个怎么办?
var counter100 = makeCounter(100);
alert(counter100()); // alerts "100"
如果对makeCounter()的两次调用共享一个参数实例,那么当我随后调用“counter1()”时会发生什么?
内容总结
以上是互联网集市为您收集整理的为什么每次调用函数时Javascript引擎都需要创建一个激活对象?全部内容,希望文章能够帮你解决为什么每次调用函数时Javascript引擎都需要创建一个激活对象?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。