是没有传递值时声明的函数的参数?

时间:2014-04-06 08:59:42

标签: javascript function

我对Javascript语言有一般性的疑问。 当我定义这样的函数时:

{
  var some_func = function(arg1, arg2) {
    //some code here
  }
}

我只将第一个参数传递给函数:

var variable = some_func(a1);

是定义的arg2的第二个参数,但其值为undefined或完全是undefined

或者用它来解释:当函数被定义时,函数的参数是简单定义为变量还是对象属性,还是在幕后有一些动态声明机制?

4 个答案:

答案 0 :(得分:3)

function foo(bar) {
    console.log(bar);
    console.log(baz);
}

> foo()
< undefined
< ReferenceError: Can't find variable: baz

参数始终是“已定义”但可能具有值undefined。未定义的变量确实未定义并导致错误。

答案 1 :(得分:3)

声明函数时,您定义的所有参数都称为形式参数。当您调用该函数时,您将获得一个参数列表。在运行时,

  1. 如果参数的数量与Formal参数的数量匹配,则每个形式参数将具有与其对应的参数。

  2. 如果参数的数量大于形式参数的数量,则只能使用arguments特殊变量访问传递的其余参数。

  3. 如果参数的数量小于形式参数的数量,它们将被分配undefined

  4. 所以,回答你的问题

      

    是第二个参数arg2定义但值为undefined或者它是完全未定义的

    arg2是一个形式参数,在您的情况下会将undefined传递给它。

    参考 ECMA标准规范文档,第Declaration Binding Instantiation部分。

    引用它,

      

    一个。设func是[[Call]]内部方法启动代码执行的函数。设名是func的[[FormalParameters]]内部属性的值。

         

    湾设argCount为args中的元素数。

         

    ℃。设n为数字0。

         

    d。对于名称中的每个String argName,按列表顺序执行

     i. Let n be the current value of n plus 1.
    
    ii. If n is greater than argCount, let v be undefined
        otherwise let v be the value of the n’th element of args.
    

答案 2 :(得分:2)

考虑声明的变量和定义的变量之间的区别。

  • 声明的变量意味着变量名称存在于当前作用域中,并且按名称引用该变量不会产生引用错误

  • 定义的变量是一个值不是undefined的变量

函数的形式参数总是声明,但如果函数调用被赋予这些参数的定义值,它们只能定义

同样,没有像var foo;这样的任何赋值的变量声明会在其包含范围内声明foo,但不会为foo提供定义的值。

有关正式论证和arguments变量的更全面,具体的概述,请参阅thefoutheye's answer

答案 3 :(得分:1)

arg2只有undefined,但已定义。当我说定义时,我的意思是说你已经定义了参数,但如果没有传递一个值,它将有undefined

要证明,

让我们做这样的功能:

 var some_func = function(arg1, arg2) {
     alert(arg1); alert(arg2);
  }

 some_func('a'); // alerts a and undefined
 some_func('a','b'); // alerts a and b

更加澄清:

var x; // defined but has undefined value will not throw error Result in undefined
y; // not defined and throws a value. Result in ReferenceError

在这种情况下,arg2就像变量x