2011-11-29 78 views
9

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

为什么:

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

而不是:

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

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

+0

为什么你想关键字那里? 'var'声明变量,参数(有点)不同。这里没有关键字,它没有增加任何价值。 – 2011-11-29 12:14:02

+0

这不是一个足够好的理由吗? var会给你什么额外的信息?此外,每次声明一个函数var时,您都可以保存4个字符,为了清晰起见,您可以使用变量名称。 – Asken

+1

由于ECMA-262表示形式参数(如声明的变量)在执行任何代码之前都会创建局部变量对象的命名属性。所以一个正式的参数或多或少是默认声明的。 – RobG

回答

6

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

+0

我会说他们是函数的_explicitly_参数。 – nnnnnn

+0

@nnnnnn好点,我已经更新了我的答案 –

2

关键字var声明变量的范围。函数参数还介绍了该参数的范围。因此不需要它,因为它具有相同的功能。

7

大多数动态类型编程语言不要在参数列表中有显式变量。 var关键字的目的是与“我设置一个现有的变量”,并在

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

(只有极少数的语言“我创建一个新的变量”,像Python,用var完全消失分化但也有一些问题,例如,封锁和意外错别字等等变种仍然十分普遍)

但在参数列表你不能分配到现有变量所以以前的模糊性并不需要解决的问题。因此,参数列表中的var声明只不过是多余的样板。 (和冗余的样板是坏的 - 看到COBOL在exibit A)


你可能正从C或Java,但在他们的情况类型声明你的想法一倍,作为变量声明,并在参数列表的克鲁夫特是声明的类型和而不是

我们甚至可以在某些类型的语言中摆脱“无类型,无变化”的参数列表。例如,在Haskell中,可以推断类型,因此不需要将它们写在参数列表中。正因为如此的参数列表只包含变量名,并在JavaScript的情况下,我们并不需要把多余的“让”(Haskell的相当于“变种”到)在那里:

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

这是一个很好的答案,为什么它没有得到任何的爱:( – Esailija

+0

“但是在参数列表中你不能指定变量” - 有些语言允许你指定默认值在参数列表中(如果参数不是由调用者提供的话),但即使允许使用JavaScript,我们仍然不需要参数列表开头的'var'。 – nnnnnn

1

我觉得问题出现了,因为我们习惯于在很多语言中看到function bla (int i)。同样的,在句法上,作为int i;某处在函数体中声明一个变量。然而两个int却不一样;第一个定义类型,第二个定义类型和范围。如果不必声明类型,范围声明仍然需要发生(这就是为什么我们在第二种情况下有var),但在参数前没有需要的信息。

相关问题