当前位置: 首页 > 面试题库 >

JavaScript什么是词汇范围?

太叔灿
2023-03-14
问题内容

什么是词汇作用域简介?


问题答案:

我通过示例了解它们。:)

首先,采用类似C的语法的 词汇作用域 (也称为 静态作用域 ):

void fun()
{
    int x = 5;

    void fun2()
    {
        printf("%d", x);
    }
}

每个内部级别都可以访问其外部级别。Lisp的第一个实现使用另一种称为动态范围的方式,再次使用类似C的语法:

void fun()
{
    printf("%d", x);
}

void dummy1()
{
    int x = 5;

    fun();
}

void dummy2()
{
    int x = 10;

    fun();
}

在这里fun既可以访问xdummy1dummy2,或x在调用任何函数funx在其声明

dummy1();

将打印5

dummy2();

将打印10。

第一个称为静态,因为它可以在编译时推导,第二个称为动态,因为外部范围是动态的,并且取决于函数的链调用。

我发现静态范围界定对眼睛来说更容易。最终,大多数语言都采用了这种方式,甚至Lisp也是如此(对吗?)。动态作用域就像将所有变量的引用传递给调用的函数一样。

作为为什么编译器无法推断函数外部动态范围的示例,请考虑我们的最后一个示例。如果我们这样写:

if(/* some condition */)
    dummy1();
else
    dummy2();

调用链取决于运行时条件。如果为true,则调用链如下所示:

dummy1 --> fun()

如果条件为假:

dummy2 --> fun()

fun两种情况的外部范围都是调用方加上调用方的调用方,依此类推。只需提及C语言既不允许嵌套函数也不允许动态作用域。



 类似资料:
  • 问题内容: 在Go规范的包初始化部分中,“词汇文件名顺序”是什么意思? 为了确保可重现的初始化行为,鼓励构建系统以词法文件名的顺序向编译器提供属于同一软件包的多个文件。 问题答案: 从维基百科: 词法顺序是词的字母顺序基于其组成字母的字母顺序的方式的概括。 实际上,这意味着将文件名作为字符串进行比较,使用字符代码确定顺序。英文字母的字符代码顺序遵循字母的自然顺序,但是如果文件名中也包含非字母(例如

  • 问题内容: javascript中变量的范围是什么?它们在函数内部和外部的作用域是否相同?还是有关系吗?另外,如果变量是全局定义的,则将变量存储在哪里? 问题答案: TLDR JavaScript具有词汇(也称为静态)作用域和闭包。这意味着您可以通过查看源代码来确定标识符的范围。 四个范围是: 全球-一切可见 功能-在功能(及其子功能和块)中可见 块-在块(及其子块)中可见 模块-在模块内可见 在

  • 下面的代码总是打印传入参数的参数,而不考虑是否存在同名变量。 可能是因为参数标识符单独绑定到作用域中的变量。他们的位置在哪里?他们在词汇环境中吗? null null 是否声明最终位于特殊的VariableEnvironment中,而参数位于lexicalEnvironment中?和和通过使重定义成为早期错误来避免冲突? 相关的还有: 8.3.2 ResolveBinding(名称[,env])

  • 本文向大家介绍什么是汇编语言,包括了什么是汇编语言的使用技巧和注意事项,需要的朋友参考一下  汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器

  • 问题内容: 我试图了解在多个JavaConfig上下文中放置注释的正确位置在哪里? 考虑以下情形:我在JPAConfig.java和AppConfig.java中具有服务bean集的JPA配置。然后,在RootConfig.java中编写整个应用程序配置。 我在JPAConfig.java中定义事务管理器,并启用对JPA存储库的扫描- 当这些暴露事务行为时,我将其放到JPAConfig上,并且它可

  • 我刚开始编码。我想对同一个变量使用两次switch语句,我被告知要这样做,变量必须是'inscope'。 作为一个初学者,我不知道那是什么意思。那么在范围内意味着什么呢?而且,如果一个变量不在作用域中,我如何使它在作用域中?