[英]Why are arguments in JavaScript not preceded by the var keyword?
这可能是一个愚蠢的问题,但为什么JavaScript中的函数参数前面没有var关键字?
为什么:
function fooAnything(anything) {
return 'foo' + anyThing;
}
并不是:
function fooAnything(var anything) {
return 'foo' + anyThing;
}
我有一种感觉,答案是because that's what the Spec says
但仍然......
大多数动态类型编程语言在参数列表中没有显式变量。 var关键字的目的是区分“我正在设置现有变量”和“我正在创建一个新变量”,如
var x = 17; //new variable
x = 18; //old variable
(只有少数几种语言,比如Python,完全消除了var,但是存在一些问题,例如关闭和意外的拼写错误,因此var仍然很普遍)
但是在参数列表中, 您无法分配给现有变量,因此不需要解析先前的歧义。 因此,参数列表中的var声明只不过是冗余样板。 (冗余样板很糟糕 - 参见exibit A中的COBOL)
您可能从C或Java中获取了您的想法,但在它们的情况下,类型声明会将变量声明加倍,参数列表中的残差是针对类型而不是声明。
我们甚至可以使用某些类型语言中的“无类型,无变量”参数列表。 例如,在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
这将是var
关键字的冗余使用。 出现在函数名称声明后面的括号中的项目是函数的显式参数。
var
关键字声明变量的范围。 函数参数还引入了该参数的范围。 因此没有必要,因为它具有相同的功能。
我认为这个问题出现了,因为我们习惯于在许多语言中看到function bla (int i)
。 语法上与int i;
在函数体中的某个地方声明一个变量。 这两个int
s的然而,不是做同样的; 第一个定义类型,第二个定义类型和范围。 如果您不必声明类型,则仍需要发生scope-declaration(这就是我们在第二种情况下使用var
原因)但是在参数前面不需要任何信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.