繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM