手机版

浅析javascript中豹形参与实际参数

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

所以下面几个例子的语句也要改一下:回到例子,fn_2函数语法测试通过,从第二步开始,不带参数的:复制代码如下: fn _ 2();函数fn _ 2(x){//参数赋值完成,参数参数列表为空,因为没有实际参数。同时,从关联信息判断,明显存在形式参数和自变量为空,相互独立,未来不会与var x=3关联;//x赋值为3,x和参数[0]相互独立,参数[0]仍然是未定义的console.log (x,参数[0]);//print x=3,参数[0]是未定义的参数[0]=2;//参数被赋值,x和参数[0]相互独立。因此,x=3不会改变console.log(x,参数[0]);//print x=3,参数[0]=2}带参数,复制代码如下:带参数fn _ 2(1);函数fn _ 2(x){//参数赋值完成,参数[0]=1。同时,形式参数x有一个值,这个值是相关的,并且总是同心的。var x=3;//x被赋值为3,x与参数[0]相关联,因此参数[0]被赋值为3。console.log(x,参数[0]);//print x=3,参数[0]=3参数[0]=2;//参数[0]的赋值为2。由于x和参数[0]已经关联在一起,x同时更改console.log(x,参数[0]);//Print x=2,参数[0]=2}反过来应该是一样的:不带参数的复制代码如下: fn _ 2();函数fn_2(x){//与参数[0]=2没有关联;//找不到对应的x(未定义),独立于console.log(x,参数[0]);//未定义,2x=3;//相互独立,快照。虽然参数是动态添加的,但是老的和死的没有联系,所以还是失败了console.log(x,arguments[0]);//3,2}带参数的复制码如下: fn _ 2(1);函数fn_2(x){参数[0]=2;//associate console.log(x,参数[0]);//2,2 x=3;//associate console.log(x,参数[0]);//3,3}由于我们只有一个形式参数,可能不够有说服力,所以现在增加到两个。只有一个参数:复制代码如下: fn _ 2(1);函数fn_2(x,y){ //arguments的赋值完成,arguments [0]=1,arguments[1]=undefined,因此只有x与arguments[0]相关联,y和arguments[1]从不转到console.log (x,y,arguments[0])。//1,未定义,1,未定义var x=3;//x被赋值为3,x与参数[0]相关联,因此参数[0]被赋值为3。console.log(x,y,参数[0],参数[1]);//3,未定义,3,未定义var y=4;//y赋给3,y独立于参数[1],参数[1]仍未定义console.log (x,y,参数[0],参数[1]);//3,4,3,未定义的参数[0]=2;//参数[0]的赋值为2。由于x和参数[0]已经关联在一起,x同时更改console.log (x,y,参数[0],参数[1]);//2,4,2,未定义的参数[1]=5;//arguments[1]赋值为5,y独立于arguments[1],所以y保持4console.log (x,y,arguments [0],arguments[1]);//x=2,y=4,参数[0]=2,参数[1]=5}有两个参数:复制代码如下: fn_3(1,6);函数fn_3(x,y){//参数赋值完成,参数[0]=1,参数[1]=6,x与参数[0],y与参数[1]相互关联。console.log (x,y,参数[0],参数[。//1,6,1,6 var x=3;//x被赋值为3,x与参数[0]相关联,因此参数[0]被赋值为3。console.log(x,y,参数[0],参数[1]);//3,6,3,6 var y=4;//y被赋值为3,y与参数[1]相关联,因此参数[1]被赋值为4。

console.log(x,y,参数[0],参数[1]);//3,4,3,4参数[0]=2;//参数[0]被赋值2,由于x与参数[0]已经关联到一起,于是x同时改变console.log(x,y,参数[0],参数[1]);//2,4,2,4参数[1]=5;//参数[1]被赋值5,由于y与参数[1]已经关联到一起,于是y同时改变console.log(x,y,参数[0],参数[1]);//x=2,y=5,参数[0]=2,参数[1]=5 }以上全部是推测,因为实际中没有办法形参的信息,所以我按照推测写了一个小测试:下面的也改了:复制代码代码如下: function _Function(){//获得的形参列表为数组:_ args var _ args=[];for(var I=0;我参数。长度-1;I){ var obj={ };obj['key']=参数[一];obj[参数[i]]=未定义;_ args。推送(obj);}//这个_ argu=_ argsvar fn_body=引数【论据。长度-1];//下面的方法获取实参_参数,这里参数(_ r)实现为一个数组,而非争论对象this.exec=function(){ //函数运行时,实参参数(_ r)被赋值var _ arguments=[];for(var I=0;一、论点。长度;I){ _引数[i]=引数[一];} //下面执行函数体eval(fn _ body);} } 替换成:复制代码代码如下: function _Function(){//获得的形参列表为数组:_ args var _ args=[];for(var I=0;我参数。长度-1;I){ var obj={ };obj['key']=参数[一];obj[参数[i]]=未定义;_ args。推送(obj);}//这个_ argu=_ argsvar fn_body=引数【论据。长度-1];//下面的方法获取实参_参数,这里参数(_ r)实现为一个数组,而非争论对象this.exec=function(){ //函数运行时,实参参数(_ r)被赋值var _ arguments=[];for(var I=0;一、论点。长度;I){ _引数[i]=引数[一];} //在运行开始就判断关联信息for(var j=0;j Math.min(_arguments.length,_ args。长度);j){ _ args[j][' link ']=true;} //下面执行函数体eval(fn _ body);} } 上面按理来说,关联应该是把两者指向同一个对象,可是我只需要分析例子,没打算做得那么精细,所以是在函数体里面用如果语句判断的。把例子中fn_2换成对应的形式就是:复制代码代码如下: //函数fn _ 2(x){//var x=3;//console.log(x,参数[0]);//参数[0]=2;//console.log(x,参数[0]);//} //fn_2(1) //在fn_2body中,用_ args[I][' link ']=true;来表示形参与实参相关联var fn _ 2 body=' ' ' _ args[0][_ args[0][' key ']=3;'if(_ args[0][' link ']){ _ args[0]=_ args[0][_ args[0][' key ']];} ' '控制台。log(_ args[0][_ args[0][' key '],_ args[0]);_ args[0]=2if(_ args[0][' link ']){ _ args[0][_ args[0][' key ']=_ args[0]} '控制台。log(_ args[0][_ args[0][' key '],_ args[0]);var fn_2=new _Function('x ',fn _ 2 body);fn _ 2。exec(1);画了一张图来表示实例与改写函数两者的关系,顺便也改了一下

回到文章开头的例子:复制代码如下:函数fn(x){ x=10;参数[0]=20;Console.log(x,参数[0])} fn()显然,它们是相互独立的:x=10,参数[0]=20;猜测:复制代码如下:函数fn(x){ x=10;参数[0]=20;Console.log (x,arguments [0])} fn (1)应该都是输出20,复制代码如下:函数fn(x){ arguments[0]=20;Console.log (x,arguments [0])} fn (1)也应该是输出20,复制代码如下:函数fn(x){ arguments[0]=20;Console.log(x,参数[0])} fn()应该未定义并且为20。原文来自小西山子,cnblogs。

版权声明:浅析javascript中豹形参与实际参数是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。