gpt4 book ai didi

javascript - 从逻辑 Angular 来看,JavaScript 执行上下文和 JavaScript 对象是同一件事吗?

转载 作者:行者123 更新时间:2023-12-02 17:29:07 27 4
gpt4 key购买 nike

我对 JavaScript 的理解是,在脚本执行时会创建一个全局执行上下文 - 我理解为保留内存空间中的一系列键:值对 - 很像常规的 JavaScript 对象。

在函数执行时,会创建一个新的执行上下文,并可以访问“父”执行上下文。 (对我来说)这至少相当于重新初始化 JavaScript 执行环境。除了最初在全局对象中设置的键:值对不需要添加到新的执行上下文中,因为子执行上下文可以访问父级的键:值对。

例如:

function Y() {
this.prop = 4;
};

Y.prototype.doY = function() {
console.log(this.prop);
};

function X(){
this.prop = 5;
this.y = Object.create(Y.prototype);
Y.call(this.y);
};

// I can instantiate the object like so:
var x = new X();

// Which is equivalent to the following:
var x = Object.create(X.prototype);
X.call(x);

// Then I can add a function to the object that the X constructor points to via the X.prototype reference:
X.prototype.doX = function() {
console.log(this.prop)
};

// And then i can execute doX() in the context of the x object
x.doX(); // 5
x.y.doY(); // 4

执行时,doX 函数创建一个从 x 对象内引用的执行上下文。 x 对象又在全局对象中被引用。

同样,在执行时,doY 函数会创建一个从 x.y 对象内部引用的执行上下文。

在我看来,从逻辑 Angular 来看,函数执行创建的执行上下文基本上等同于 JavaScript 对象:

  • 两者都允许父对象/执行上下文不可见的变量声明
  • 两者都包含对父对象/执行上下文的某种内部引用

看起来对象和执行上下文都只是一个键:值列表,整个列表由单个(仅单个)父对象引用(即 y 对象作为x 执行上下文中的引用) - 或全局对象作为根父对象(x 对象作为全局执行上下文中的引用存在)。

所以问题是:JavaScript执行上下文和JavaScript对象一样吗?如果不是,有什么区别?

这个问题:Are Execution Context and Variable Object actually same thing in JavaScript?提到在实现方面,执行上下文和对象不是同一件事。

执行上下文继承自 Object 是否正确?或者对象/执行上下文的实现完全不相关...我可以看到的一个区别是,在创建时,执行上下文是从上到下(从词汇上讲)“处理”的,允许作者指定命令式命令 - 即指示计算机做事。但就架构而言,这种差异似乎是对象概念的延伸,而不是完全不同的东西。

在我看来,“运行 JavaScript 环境”如果存在的话,基本上就是一棵树。根节点是全局执行上下文,创建对象会将节点添加到根节点,或者(如上面 y 的情况)将节点添加到子节点。然后,子节点通过属性引用父节点,以允许将范围限定到父执行上下文。

然后就闭包而言,涉及创建(和执行)执行上下文,返回时结果对象看起来完全像常规对象,因为闭包引用的“执行上下文”将永远不会再次被执行(即相同的函数,重新执行将创建一个新的执行上下文和闭包)。

因此,从“应用”的 Angular 来看,是否有一次 this -> 即对当前执行上下文的自引用与函数所在的对象不同进行了调用(除了使用 callapplybind 时)?即,在 x.y.doY() 的情况下,从 x.y 对象调用函数 doY

最佳答案

Execution contexts概念上对象,是的,规范中的其他一些内容也是如此。这并不意味着它们与 JavaScript 对象“相同”。它们是一个规范设备,在运行时可能根本不存在;代码无法直接引用它们。如需完整图片,请阅读Executable Code and Execution Contexts在规范中。

Is JavaScript execution context the same as a JavaScript object?

没有。 JavaScript 对象可以直接被代码引用,具有原型(prototype),并且具有为其描述的特定行为(未针对执行上下文进行描述)等。

Would it be correct to say that execution context inherits from Object?

不,规范中没有任何内容表明情况如此。

It seems to me that a 'running JavaScript environment' if such a thing exists, is basically a tree.

有点,相当间接。该规范没有描述从执行上下文到其父上下文或子上下文的任何链接。相反,lexical environment作为上下文状态一部分的对象(特别是 LexicalEnvironment 和 VariableEnvironment 状态组件)具有到其父词法环境的链接,以便进行绑定(bind)解析。 (父级 lexenv 在规范中没有指向其子级的链接。)但它们也纯粹是一个规范设备,在运行时可能并不真正存在,并且不能由代码直接引用。

因此,将它们视为对象是绝对正确的,这就是规范对它们的描述,但它们不是通常理解该术语的 JavaScript 对象 - 代码可以直接引用并执行操作的东西。

关于javascript - 从逻辑 Angular 来看,JavaScript 执行上下文和 JavaScript 对象是同一件事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48418044/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com