如果从未调用过声明变量的函数,JS变量是否具有作用域?

时间:2019-07-14 01:58:48

标签: javascript variables scope global-variables lexical

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

var foo = 42;
var bar = 43;

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

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

您怎么看?如果从未调用函数greetingnamegreet()可以有作用域吗?

3 个答案:

答案 0 :(得分:0)

这在某种程度上是一个理论问题,类似于“如果一棵树掉在森林里……”。

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

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

答案 1 :(得分:0)

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

  

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

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

  

将值分配给未声明的变量将其隐式创建为   全局变量(它成为全局对象的属性)时,   分配已执行。

     

未声明的变量不存在,直到分配给它们的代码为   被执行。

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

name不是变量,而是参数,其作用类似于占位符。

简而言之,有两个全局变量-foobar,如果调用函数greet,则将有三个全局变量foo,{{1 }}和bar

答案 2 :(得分:0)

  

如果从不调用greet()函数,则问候语和姓名可以有作用域吗?

是的,name已经存在于本地范围内,尽管该函数尚未执行,但仍在解析中。

greeting仅在调用函数时存在,但它在全局范围内是否无关紧要,因为它具有隐式全局变量只是一种不好的做法。