Javascript 没有传递值时是否声明函数的参数?
我有一个关于Javascript语言的一般性问题。 当我定义这样的函数时:Javascript 没有传递值时是否声明函数的参数?,javascript,function,Javascript,Function,我有一个关于Javascript语言的一般性问题。 当我定义这样的函数时: { var some_func = function(arg1, arg2) { //some code here } } var variable = some_func(a1); 我只向函数传递第一个参数,如下所示: { var some_func = function(arg1, arg2) { //some code here } } var variable = some_
{
var some_func = function(arg1, arg2) {
//some code here
}
}
var variable = some_func(a1);
我只向函数传递第一个参数,如下所示:
{
var some_func = function(arg1, arg2) {
//some code here
}
}
var variable = some_func(a1);
第二个参数arg2
已定义,但值为undefined
还是完全undefined
或者解释一下:当定义函数时,函数的参数只是定义为变量或对象属性,还是在幕后有某种动态声明机制?
arg2
将只有未定义的,但它是定义的。当我说defined时,我的意思是说你已经定义了参数,但是如果没有传递一个值,它将有未定义的
证明
让我们这样做函数:
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
arg2
将只有未定义的
,但它已定义。当我说defined时,我的意思是说你已经定义了参数,但是如果没有传递一个值,它将有未定义的
function foo(bar) {
console.log(bar);
console.log(baz);
}
> foo()
< undefined
< ReferenceError: Can't find variable: baz
证明
让我们这样做函数:
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
函数foo(bar){
function foo(bar) {
console.log(bar);
console.log(baz);
}
> foo()
< undefined
< ReferenceError: Can't find variable: baz
控制台日志(bar);
控制台日志(baz);
}
>foo()
<未定义
参数始终为“已定义”,但可能具有值未定义
。未定义的变量实际上是未定义的,并且会导致错误。函数foo(bar){
控制台日志(bar);
控制台日志(baz);
}
>foo()
<未定义
参数始终为“已定义”,但可能具有值未定义
。未定义的变量实际上是未定义的,会导致错误。当您声明一个函数时,您定义的所有参数都称为形式参数。当您调用函数时,您将获得一个参数列表。在运行时
如果参数的数量与形式参数的数量匹配,则每个形式参数都将有与其对应的参数
如果参数的数量大于形式参数的数量,则只能使用特殊变量访问传递的其余参数
如果参数的数量小于形式参数的数量,则将分配它们
那么,来回答你的问题
第二个参数arg2是否已定义但值为未定义,还是完全未定义
arg2
是一个形式参数,在您的案例中,undefined
被传递给它
参考ECMA标准规范文件第节
引述,
a。设func是其[[Call]]内部方法启动代码执行的函数。让名称为func的[[FormalParameters]]内部属性的值
b。设argCount为args中的元素数
c。设n为数字0
d。对于名称中的每个字符串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.
声明函数时,定义的所有参数都称为形式参数。当您调用函数时,您将获得一个参数列表。在运行时
如果参数的数量与形式参数的数量匹配,则每个形式参数都将有与其对应的参数
如果参数的数量大于形式参数的数量,则只能使用特殊变量访问传递的其余参数
如果参数的数量小于形式参数的数量,则将分配它们
那么,来回答你的问题
第二个参数arg2是否已定义但值为未定义,还是完全未定义
arg2
是一个形式参数,在您的案例中,undefined
被传递给它
参考ECMA标准规范文件第节
引述,
a。设func是其[[Call]]内部方法启动代码执行的函数。让名称为func的[[FormalParameters]]内部属性的值
b。设argCount为args中的元素数
c。设n为数字0
d。对于名称中的每个字符串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.
考虑声明变量和定义变量之间的差异
- 声明的变量表示变量名存在于当前范围中,按名称引用该变量不会产生引用错误
- 定义变量是指其值未定义的变量
函数的形式参数始终是声明的,但它们仅在函数调用为这些参数指定了定义值时才定义
类似地,没有任何赋值的变量声明,如var foo
将在其包含范围内声明foo
,但不会为foo
提供定义的值
有关形式参数和参数
变量的更全面、更具体的概述,请参见。考虑声明变量和定义变量之间的差异
- 声明的变量表示变量名存在于当前范围中,按名称引用该变量不会产生引用错误
- 定义变量是指其值未定义的变量
函数的形式参数始终是声明的,但它们仅在函数调用为这些参数指定了定义值时才定义
类似地,没有任何赋值的变量声明,如var foo
将在其包含范围内声明foo
,但不会提供foo