当前位置: 首页 > 知识库问答 >
问题:

与JavaScript作用域的混淆[重复]

汤洋
2023-03-14

我对JavaScript作用域有相当的了解--该语言具有函数级作用域,变量和函数声明被提升到其包含作用域的顶部。但是,我想不通为什么下面两段代码记录了不同的值:

这会将值1记录到控制台:

var a = 1;
function b() {
    a = 10;
    return;
    function a() {}
}
b();
console.log(a);

神秘的是,这记录了10:

var a = 1;
function b() {
    a = 10;
    return;        
}
b();
console.log(a);

那引擎盖下面是怎么回事?

共有2个答案

谢善
2023-03-14

这是因为当您使用声明的函数时,它会被提升并变成一个函数表达式,即var a=function(){};这会与您的a变量产生冲突。

巫培
2023-03-14

我觉得第一个例子更神秘...

在第二个示例中,不在函数内部声明变量a。因此,当您分配给A时,它的目标是外部的A。很直截了当。

在第一个示例中,您在函数内部声明了一个变量a,但以一种不同寻常的方式:通过声明一个名为a的函数。因此赋值给a将使用该局部“变量”。

这里要带走两件事:

a)变量和函数声明被“吊起”到其作用域的顶部。虽然函数a(){}被写入接近结尾处,但保存它的变量a已经创建并可见于作用域的顶部。

b)函数也可以用作变量。你可以传递函数,你可以重新分配函数定义。它们与其他变量共享相同的命名空间。

 类似资料:
  • 我正在实现的API仅适用于具有特定范围、经典场景的用户。然而,我对访问令牌的一些事情并不了解。 我认为这很简单,我只是接收JWT,验证它,读取范围。 但由于访问令牌格式未规范化,JWT可能包含任何内容。我应该假设每次都有范围吗?每个IdP都把他们放进去了吗? 我需要调用内省endpoint并从中检索数据。 但是RFC7662第2.2节说,实际上,响应中只有所需的数据是激活的,其余数据是可选的。 这

  • 我在研究JS中变量作用域的概念时,在上面发现了这个例子: 此函数的输出为 现在我很困惑,为什么gets会在第二个日志中获得值3。即使在语句中使用声明时也是如此。在中声明的不是应该在中获得一个新实例吗?

  • 问题内容: 我真的很困惑。我已经尝试过使用tomcat的Jax-rs并使用所有能够使用调用我的服务的注释。因此,没有Jax- rs,我可以简单地拥有一个servlet并调用我的服务。同样,正如我尝试过的那样,有jax-rs和jersey(我研究了的实现)以及web.xml中的以下内容。 然后,我在GET上具有与JAX-RS相同的注释,可以使用正确的URL调用我的服务。 我的问题是,为什么球衣使用s

  • 问题内容: 我试图从不同的部分组成URL,并且在理解此方法的行为时遇到了麻烦。例如: Python 3.x 您能否解释这种方法的确切行为? 问题答案: (对我而言)最好的方式是第一个参数,就像您在浏览器中所在的页面一样。第二个参数是该页面上锚点的href。结果是您单击后将定向到的最终URL。 根据我的描述,这很有意义。尽管希望基础包括一个方案和领域。 如果您在某个虚拟主机上,并且有一个类似的锚,则

  • 问题内容: 我是使用属性的新手,因此我进行了如下所示的简单测试。在测试中,我创建了两个类“ Test1”和“ Test2”,每个类都持有一个值。我正在尝试使用属性来控制对伪隐藏的“ val”属性的访问。当前测试不限制“ val”属性的任何输入或输出,因为该程序仅是概念证明。下面显示的两个测试类产生相同的结果,并被认为代表了构造属性的不同方法。我要引用的属性的示例使用在python docs上找到。