在这段代码中,greet
函数的全局范围中有多少个变量,局部变量中有多少个?
var foo = 42;
var bar = 43;
function greet(name) {
greeting = 'Hello';
return greeting + ' ' + name;
}
我相信有两个全局变量(foo
和bar
)和0个局部变量。由于永远不会调用该函数,因此name
和greeting
不会被声明,因此我要说它们不在全局或局部范围内。
您怎么看?如果从未调用函数greeting
,name
和greet()
可以有作用域吗?
答案 0 :(得分:0)
这在某种程度上是一个理论问题,类似于“如果一棵树掉在森林里……”。
答案取决于您是从静态词汇角度还是从动态执行环境角度分析问题。不过,对于后者,您的分析是准确的。如果执行了上面的代码,则在全局空间中将定义三个标识符,两个var和函数。 Greeting var和name参数将不会“出现”。
也就是说,如果我在代码审查中进行了静态评估,那么我将不得不问“定义函数的目的不是吗?”?必须假定它最终打算被调用-否则为什么要编写它(或就此而言,上面的任何代码)。因此,使用该函数肯定会引入全局变量。
答案 1 :(得分:0)
来源-https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var
用var声明的变量的范围是其当前执行 上下文,可以是封闭函数,也可以是变量 在任何全局函数之外声明。
变量foo
和bar
在顶部声明。因此,它们将直接分配给窗口对象(全局范围)。
将值分配给未声明的变量将其隐式创建为 全局变量(它成为全局对象的属性)时, 分配已执行。
未声明的变量不存在,直到分配给它们的代码为 被执行。
未声明变量greeting
,该变量存在于未调用的函数greet
中。因此,在调用该函数之前,不会创建变量greeting
,如果调用该函数,则会将greeting
创建为全局变量。
name
不是变量,而是参数,其作用类似于占位符。
简而言之,有两个全局变量-foo
和bar
,如果调用函数greet
,则将有三个全局变量foo
,{{1 }}和bar
。
答案 2 :(得分:0)
如果从不调用greet()函数,则问候语和姓名可以有作用域吗?
是的,name
已经存在于本地范围内,尽管该函数尚未执行,但仍在解析中。
greeting
仅在调用函数时存在,但它在全局范围内是否无关紧要,因为它具有隐式全局变量只是一种不好的做法。