Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中声明函数时必须使用'var'吗?_Javascript - Fatal编程技术网

在javascript中声明函数时必须使用'var'吗?

在javascript中声明函数时必须使用'var'吗?,javascript,Javascript,考虑以下两个功能: cat = function() { console.log("Meow"); } 以及: cat()->“喵喵” dog() 它们都可以工作,除了cat不是使用var声明的。这是否意味着它是全局作用域?我想这两个函数都是全局作用域。还有语法function cat(){…},我想这类似于第一种样式,某种隐式变量绑定 有人能解释一下声明函数的风格之间的区别吗,如果有的话。不使用var/let/const会使它成为隐式全局的,这通常被认为是一件坏事。如果使用'use s

考虑以下两个功能:

cat = function() {
  console.log("Meow");
} 
以及:

cat()
->“喵喵”

dog()

它们都可以工作,除了cat不是使用
var
声明的。这是否意味着它是全局作用域?我想这两个函数都是全局作用域。还有语法
function cat(){…}
,我想这类似于第一种样式,某种隐式变量绑定


有人能解释一下声明函数的风格之间的区别吗,如果有的话。

不使用var/let/const会使它成为隐式全局的,这通常被认为是一件坏事。如果使用
'use strict'
,任何隐式全局都会出现错误。隐式全局的最大问题是全局变量是指您可能不知道自己已生成全局变量。例如:

(function() {
   a = 5;
})();

// a doesn't exist right?
console.log(a); // 5... whoops!

不,您不需要。您可以这样声明函数:

function foo(){
}
然后在适当的范围内自动声明
foo
。 它的all是一个作用域的问题。解释器将在哪里声明函数。按照您的方式执行,而不使用
var
将导致解释器自动创建一个全局变量,这是可能的最高作用域,意味着它可以在代码中的任何地方访问。这被视为不好的事情,因为除非是故意的,否则你通常不想这么做,因为如果你愿意的话,我可以深入探讨一些深层次的原因

函数foo(){
功能条(){
控制台日志(“bar”);
}
bar();
控制台日志(条形图类型);
}
foo();

bar();//将引发错误,因为“bar”在此范围内不存在
变量

  • 如果不指定
    var
    let
    const
    ,它将获得全局范围
  • 如果确实指定了
    var
    let
    const
    ,则根据特定的说明符,它将被限定到最近的封闭范围
var
-如果未在函数内部定义,将范围限定到最近的封闭函数或全局范围)

let
&
const
-将范围限定到最近的封闭块)

功能

按如下方式分配函数:

var dog = function() {
   console.log("woof")
}
function cat(){...}
意味着在执行过程中,直到到达声明该函数的行时,才能访问该函数,也就是说,您只能在声明该函数的行之后执行该函数

鉴于声明函数如下:

var dog = function() {
   console.log("woof")
}
function cat(){...}

这意味着它将被移动到封闭范围的顶部,因此您可以从可访问范围内的任何位置调用它,即使它在代码中早于您声明它的那一行。

不使用var/let/const会使它隐式全局,这通常被认为是一件坏事。如果使用“use strict”,您将得到一个这样做是错误的。总是最好显式声明,即使是全局的。可能重复的我看了Gerado的链接,读了snapjs写的,我想这很清楚。谢谢!可能重复的也可以看到。这不是函数声明,这是函数表达式。你应该声明一个。;-)谢谢大家回答。我接受了丽娜的回答,因为这让我很清楚这件事。我从来没有真正理解过。这是一个很好的回答。