宝哥软件园

了解Javascript_14_函数形式参数和参数

编辑:宝哥软件园 来源:互联网 时间:2021-10-22

注:阅读本博文前请先阅读《理解javascript_13_执行模型详解》。注:本文部分内容是我自己的推断,并非基于官方文件。如有错误,请改正。原始代码我们先来看一个相对原始的代码:复制代码如下:函数say (msg,other,垃圾){ alert(arguments[1]);//world var other='很高兴见到你!';var msgalert(arguments . length);警报(msg);//hello alert(其他);//很高兴认识你!alert(参数[1]);//很高兴认识你!警报(垃圾);//undefined }说(' hello ',' world ');你能正确解释代码的执行结果吗?好好想想。我觉得代码运行的结果应该和你想象的大不相同。为什么msg通常输出hello而不是undefined?当函数定义的参数与函数内部定义的变量重复时会发生什么?函数定义中实参和参数的关系是什么?我们一个一个来回答:简单记忆图

注:虚线表示曾经引用的点。首先,我们理解两个概念,形式参数和实际参数。形式参数是指在定义方法时显式指定的参数。由于Javascript语言的灵活性,在调用方法时,javascript并不要求传递的参数个数与形式参数一致。但是,实际调用javascript时传递的参数才是实际参数。参数指的是实际参数。从say方法可以看出,say定义了三个形式参数,但实际调用时只传递了两个值。因此,arguments.length的值是2,不是3。接下来,让我们看看论点的特殊行为。个人认为,参数会把所有的实际参数都当作对象,基本数据类型的实际参数会转换成它们对应的对象类型。这是通过在函数中定义与形式参数同名的变量并赋值来判断的,与参数相对应的值也会相应改变。然后,让我们分析构建say方法的执行上下文的过程。因为逻辑复杂,我在这里写了一些‘伪代码’解释一下:复制的代码如下: Function Say (msg,other,垃圾堆){//首先,函数声明的变量是‘预解析’的,内部执行过程是不可见的。var msg=未定义;var other=未定义;var垃圾=未定义;//然后“预解析”函数内部定义的变量。var other=未定义;//显然,这个定义在这个时候是没有意义的。var msg=未定义;//无意义//分配实际参数msg=new String(' hello ');//参数会将所有实际参数视为对象。其他=新字符串(' world ');//正式进入功能代码部分提醒(参数[1]);//世界其他='很高兴见到你!';//var msg;这已被预解析,因此alert(arguments.length)不会再次执行;//2警报(msg);//hello alert(其他);//很高兴认识你!alert(参数[1]);//很高兴认识你!警报(垃圾);//undefined}这段代码已经可以一边解释所有问题了。我不多说。唯一强调的一点是,内部使用var定义与形式参数同名的变量是没有意义的,因为程序‘预解析’后,它们会被视为同一个变量。其他论点有很多特点。我在文章《伪数组》中也提到了论点。感兴趣的读者可以看一下。在论据的实际应用中,你也可以参考这篇文章:http://www.gracecode.com/archives/2551/不错,就这么多。希望大家多多指正,多多指教。

更多资讯
游戏推荐
更多+