为什么JavaScript中的参数前面没有var关键字?

时间:2011-11-29 12:11:15

标签: javascript

这可能是一个愚蠢的问题,但为什么JavaScript中的函数参数前面没有var关键字?

为什么:

function fooAnything(anything) {
  return 'foo' + anyThing;
}

而不是:

function fooAnything(var anything) {
  return 'foo' + anyThing;
}

我觉得答案是because that's what the Spec says,但仍然......

4 个答案:

答案 0 :(得分:7)

大多数动态类型编程语言 在参数列表中没有显式变量。 var关键字的目的是区分“我正在设置现有变量”和“我正在创建一个新变量”,如

var x = 17; //new variable
x = 18; //old variable

(只有少数几种语言,比如Python,完全消除了var,但是存在一些问题,例如关闭和意外拼写错误,因此var仍然很普遍)

但是在参数列表中,您无法分配现有变量,因此不需要解析之前的歧义 。因此,参数列表中的var声明只不过是冗余样板。 (冗余样板很糟糕 - 参见exibit A中的COBOL)


你可能从C或Java中获得了你的想法,但在他们的案例中,类型声明加倍作为变量声明,参数列表中的cruft用于类型,而不是用于声明。

我们甚至可以在某些类型语言中使用“无类型,无变量”参数列表。例如,在Haskell中,可以推断出类型,因此您不需要在参数列表中将它们写下来。因此,参数列表只包含变量名称,并且在Javascript的情况下,我们不需要在那里放置无关的“let”(Haskell相当于“var”):

f a b =  --arguments are still variables,
         -- but we don't need "let" or type definitions
   let n = a + b in  --extra variables still need to be declared with "let"
   n + 17

答案 1 :(得分:6)

这将是var关键字的多余使用。出现在函数名称声明后面的括号中的项目是函数的显式参数。

答案 2 :(得分:2)

var关键字声明变量的范围。函数参数还引入了该参数的范围。因此没有必要,因为它具有相同的功能。

答案 3 :(得分:1)

我认为这个问题出现了,因为我们习惯于在许多语言中看到function bla (int i)。在语法上,与函数体中某处声明变量的int i;相同。然而,这两个int并没有做同样的事情;第一个定义类型,第二个定义类型和范围。如果您不必声明类型,则仍需要发生范围声明(这就是我们在第二种情况下有var的原因),但在参数前面不需要任何信息。