考虑以下两个功能:
cat = function() {
console.log("Meow");
}
和
var dog = function() {
console.log("woof")
}
cat()
- > “喵”
dog()
- > “汪
它们都有效,除了没有使用var
声明cat。这是否意味着它是全局范围的?我会说这两个函数都是全局范围的。还有语法function cat(){...}
,我猜这类似于第一种风格,某种隐式变量绑定......
有人可以解释声明函数的样式之间的区别,如果有的话。
答案 0 :(得分:2)
不使用var / let / const使其隐式全局,这通常被认为是一件坏事。如果您使用'use strict'
,则会因任何隐式全局变量而出错。隐式全局变量引起的最大问题是您可能不知道您已经创建了一个全局变量。例如:
(function() {
a = 5;
})();
// a doesn't exist right?
console.log(a); // 5... whoops!
答案 1 :(得分:2)
不,你没有。你可以声明一个这样的函数:
function foo(){
}
然后在适当的范围内自动声明foo
。
全部是范围的问题。解释器将在何处声明该函数。按照您的方式执行它,没有var
将导致解释器自动创建一个全局变量,这是可能的最高范围,这意味着它可以在代码中的任何位置访问。这被认为是一件坏事,因为除非故意这样做,否则你通常不会这样做,因为如果你愿意,我可以深入了解原因。
function foo(){
function bar(){
console.log("bar");
}
bar();
console.log(typeof bar);
}
foo();
bar(); // will throw an error since "bar" does not exist at this scope

的所有信息
答案 2 :(得分:2)
<强>变量强>
var
,let
或const
,那么它将获得全局范围var
,let
或const
,那么它将根据特定说明符确定范围到最近的封闭范围(var
- 如果未在函数内部定义,将限定范围为最近的封闭函数或全局范围)
(let
&amp; const
- 将限定范围到最近的封闭区块)
<强>功能强>
按如下方式分配功能:
var dog = function() {
console.log("woof")
}
意味着在执行期间到达声明它的行之前,该函数将无法访问,即您只能在声明它之后执行此函数。
声明函数如下:
function cat(){...}
表示它将被移动到封闭范围的顶部,因此您可以从可访问范围内的任何位置调用它,即使它在代码中的位置早于您在其上声明它的行。