我对Javascript语言有一般性的疑问。 当我定义这样的函数时:
{
var some_func = function(arg1, arg2) {
//some code here
}
}
我只将第一个参数传递给函数:
var variable = some_func(a1);
是定义的arg2
的第二个参数,但其值为undefined
或完全是undefined
或者用它来解释:当函数被定义时,函数的参数是简单定义为变量还是对象属性,还是在幕后有一些动态声明机制?
答案 0 :(得分:3)
function foo(bar) {
console.log(bar);
console.log(baz);
}
> foo()
< undefined
< ReferenceError: Can't find variable: baz
参数始终是“已定义”但可能具有值undefined
。未定义的变量确实未定义并导致错误。
答案 1 :(得分:3)
声明函数时,您定义的所有参数都称为形式参数。当您调用该函数时,您将获得一个参数列表。在运行时,
如果参数的数量与Formal参数的数量匹配,则每个形式参数将具有与其对应的参数。
如果参数的数量大于形式参数的数量,则只能使用arguments特殊变量访问传递的其余参数。
如果参数的数量小于形式参数的数量,它们将被分配undefined
。
所以,回答你的问题
是第二个参数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