javascript - Javascript 原型链与作用域链
问题描述
我创建了一个 javascript 代码片段,这里是可视化工具的链接
function Foo(name) {
this.name = name
this.speak = function() {
console.log(this.name)
}
}
function init() {
function init_() {
var foo = new Foo('foo')
foo.hear = function() {
console.log('i can hear')
}
var bar = new Foo('bar')
bar.look = function() {
console.log('i can look')
}
foo.speak()
bar.speak()
}
init_()
}
init()
我有几个问题:
原型对象又是在哪个阶段
Foo.prototype
创建的?解释器何时加载Foo
到全局范围或何时new Foo()
第一次被调用,或在任何其他阶段?它的引用存储在哪个词法范围内?(因为在可视化器中没有这样的参考)应该
foo
和bar
共享speak()
属于Foo.prototype
而不是拥有自己的副本的方法,如可视化器所示?原型链和范围链不相关吗?例如,当
foo.speak()
被调用时,首先我们跟踪作用域链来获取 的值foo
,然后原型链来获取speak()
?
解决方案
原型对象又是在哪个阶段
Foo.prototype
创建的?解释器何时加载Foo
到全局范围?
是的,原型对象是在创建Foo
函数时创建的。
它的引用存储在哪个词法范围内?(因为在可视化器中没有这样的参考)
根本没有。它仅存储在Foo
.
应该
foo
和bar
共享speak()
属于Foo.prototype
而不是拥有自己的副本的方法,如可视化器所示?
是的。看起来可视化器是为 Python 构建的,根本不支持原型链接。
原型链和范围链不相关吗?例如,当
foo.speak()
被调用时,首先我们跟踪作用域链来获取 的值foo
,然后原型链来获取speak()
?
是的是的。
但是请注意,您找到的可视化工具不显示范围链,它只显示调用堆栈,并且在正确可视化词法范围和闭包方面做得非常糟糕。
推荐阅读
- vue.js - djoser 如何在 django rest 中制作 jwt
- makefile - 如何配置 GNU Make 以将导出的变量传递给 shell 函数?
- ruby - Ruby 中的浮点值是立即数吗?
- python - Flask 400 错误请求
- python - 无法打开 json 文件
- c# - 如何给每个动态按钮创建自己的事件
- amazon-web-services - 当我尝试发送电子邮件时,Amazon SES 抛出错误 500
- python - 如何在 python 中使用 selenium 在 https://in.indeed.com/ 网站中单击 Continue 按钮?
- python - 播放音乐的问题 Discord.py
- javascript - 当我单击具有 onclick 属性的元素时如何触发另一个功能