为什么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关键字的目的是区分"我正在设置一个现有变量"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
),但是在参数前面不需要任何信息。
- 控制台返回var不是't定义,但它是
- 使用javascript中的var关键字创建块范围的变量
- 创建不带 var 关键字的全局变量时出现意外行为
- JavaScript 在函数之外使用 var 关键字
- 为什么在没有 var 关键字的情况下分配给变量时会出现引用错误
- Javascript Shadowing - 如果您尝试使用 VAR 关键字更改不存在的全局变量,则会产生效果
- Javascript:在“this”关键字之前有一个“var”关键字
- 忘记'时需要jshint错误;var'关键字
- 我的用户脚本没有'我不工作;我不知道为什么(过度使用var关键字)
- 在JS中,除了使用var关键字之外,还有其他方法来初始化变量吗?
- 在Javascript中定义变量时使用var关键字
- Var关键字和javascript函数'
- IE8获取对象预期错误-在var关键字声明XMLHttpRequest对象时发生
- Javascript:不使用var关键字时有两个输出
- 为什么JavaScript中的参数前面没有var关键字?
- 声明不带var关键字和逻辑OR的变量
- 在JavaScript中定义全局变量时省略var关键字
- 如果一个变量没有"var"函数内的关键字
- 在 ajax 请求中使用“var”关键字时非常奇怪的行为
- 为什么删除关键字而不删除带有var关键字的变量?