这可能是一个愚蠢的问题,但为什么JavaScript中的函数参数前面没有var关键字?
为什么:
function fooAnything(anything) {
return 'foo' + anyThing;
}
而不是:
function fooAnything(var anything) {
return 'foo' + anyThing;
}
我觉得答案是because that's what the Spec says
,但仍然......
答案 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
的原因),但在参数前面不需要任何信息。