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

Why are arguments in JavaScript not preceded by the var keyword?

本文关键字:var 关键字 前面 JavaScript 参数 为什么      更新时间:2023-09-26

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

原因:

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

而不是:

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

我有一种感觉答案是because that's what the Spec says,但仍然…

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

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

(只有少数语言,如Python,完全放弃了var,但存在一些问题,例如闭包和意外的拼写错误,因此var仍然广泛使用)

但是在参数列表中,您不能给现有的变量赋值,因此前面的歧义不需要解决。因此,参数列表中的var声明只不过是多余的样板文件。(冗余的样板是不好的——参见附录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

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

var关键字声明变量的作用域。函数参数还引入了该参数的作用域。因此不需要它,因为它的功能相同。

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