【问题标题】:Do JS variables have a scope if the function that declares them is never called?如果声明它们的函数从未被调用,JS 变量是否有作用域?
【发布时间】:2019-07-14 01:58:48
【问题描述】:

在这段代码中,有多少变量在全局范围内,又有多少在greet函数的局部范围内?

var foo = 42;
var bar = 43;

function greet(name) {
  greeting = 'Hello';
  return greeting + ' ' + name;
}

我相信有两个全局变量(foobar)和 0 个局部变量。由于函数永远不会被调用,namegreeting 不会被声明,所以我会说它们不在全局或本地范围内。

你怎么看?如果函数 greet() 从未被调用,greetingname 可以有一个作用域吗?

【问题讨论】:

  • 由于 JavaScript 文件通常是动态加载的,因此无法知道该函数是否会被调用。在这个 sn-p 中没有调用它,但可能有其他代码调用它。

标签: javascript variables scope global-variables lexical


【解决方案1】:

这有点像“如果一棵树落在森林里……”的理论问题。

答案取决于您是从静态词法角度还是从动态执行环境角度分析问题。不过,对于后者,您的分析是准确的。如果执行上面的代码,就会在全局空间中定义三个标识符,两个vars和function。问候 var 和 name 参数不会“出现”。

也就是说,如果我在代码审查中对它进行静态评估,我将不得不问“定义函数 greet 是否有目的”?假设必须是最终打算调用它 - 否则为什么要编写它(或就此而言,上面的任何代码)。因此,使用该函数肯定会引入一个全局变量。

【讨论】:

    【解决方案2】:

    来源 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var

    用 var 声明的变量的作用域是它当前的执行 上下文,它可以是封闭函数,也可以是变量 在任何函数之外声明,全局。

    变量foobar 在顶部声明。所以它们将被直接分配给窗口对象(全局范围)。

    为未声明的变量赋值会隐式地将其创建为 全局变量(它成为全局对象的属性)当 分配被执行。

    未声明的变量在分配给它们的代码之前不存在 执行。

    变量greeting 未声明,并且存在于未调用的函数greet 中。因此,在调用函数之前,这不会创建变量 greeting,如果被调用,它将创建 greeting 作为全局变量。

    name 不是变量,它是一个参数,作用类似于占位符。

    简而言之,有两个全局变量——foobar,如果调用函数greet,那么就会有三个全局变量foobargreeting

    【讨论】:

      【解决方案3】:

      如果从不调用函数 greet(),greeting 和 name 是否可以具有作用域?

      是的,name 已经存在于本地范围内,因为虽然该函数尚未执行,但它仍然被解析。

      greeting 但是只有在函数被调用时才会存在,但它是否在全局范围内是不相关的,因为它只是具有隐式全局变量的不好的做法。

      【讨论】:

        猜你喜欢
        • 2018-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-27
        • 1970-01-01
        相关资源
        最近更新 更多