gpt4 book ai didi

javascript - 在 Javascript 中注册变量和函数声明

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:40:25 25 4
gpt4 key购买 nike

我在看一个关于 javascript 范围的视频,它说就在浏览器解释 java 脚本代码之前,它实际上涉及一个快速编译步骤(可以这么说,不完全是“编译”,因为它不涉及制作中间文件)这在各自的范围内注册变量和函数声明。所以如果我写:

var a = 3;
function foo(){
var c = 2;
}

在评估上面的表达式之前,这意味着忽略 R.H.S.部分,变量'a'和函数'foo'将在全局范围内注册,在'foo'范围内,变量'c'将被注册。完成此编译步骤后,将计算表达式的值。

但是当我们写的时候会发生什么:

var a = function(){
var c;
}

编译步骤是否只在全局范围内注册变量“a”并跳过函数声明和变量“c”声明,因为编译步骤应该跳过 R.H.S.部分和评估表达式来自解释器部分?

最佳答案

其实是后来想出来的。是吊装。提升仅适用于变量和函数声明,不适用于函数表达式。事实证明,函数表达式中的函数及其局部变量被注册的唯一时间是 java 脚本解释器运行时(编译后),因为编译步骤不会打扰它们,因为它们位于 R.H.S 部分。这确保在函数表达式的情况下,我们仅在其赋值后调用它,并且解释器负责在全局范围内注册的函数,并将其分配给 L.H.S.变量及其局部变量的声明(var bar;):

var foo = function() {
console.log(bar);
var bar = 5;
};
foo();

此函数对象仅在解释器到达此行时创建:

var foo = function abc() {

如果这是函数声明的情况,就像这样:

foo();

function foo() {
console.log(bar);
var bar = 5;
}

提升将确保在编译步骤中注册函数“foo”并在其范围内声明变量“bar”。

尽管如此,这两个程序都会给出相同的输出 - 'undeifned'。

关于javascript - 在 Javascript 中注册变量和函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43509904/

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