美文网首页
关于js arguments和形参的映射机制

关于js arguments和形参的映射机制

作者: D_R_M | 来源:发表于2019-01-04 14:57 被阅读14次
    var a=4;
    function b(x,y,a){
      console.log(a);         //3
      arguments[2] = 10;
      console.log(a);        //10 
    }
    a = b(1,2,3);
    console.log(a); //undefined
    

    arguments:是一个对应于传递给函数的参数的类数组对象,函数内置的实参集合,是否设置形参,传递的实参值在这个集合中都存在。
    arguments.callee:指向当前执行的函数。
    arguments.length:指向传递给当前函数的参数数量。


    js在非严格模式下

    (1) 函数中的形参变量和aguments存在映射机制(映射:相互之间影响)

    • 第一个形参变量x修改为100,那个arguments[0]的值也跟着修改为100
    • arguments[1]的只修改为200,那么第二个形参变量y的值也会跟着变为200
    var a=4;
    function b(x,y,a){
      x=100;
      console.log(x);  //100
      console.log(arguments[0]); //100
      arguments[1] = 200;
      console.log(y); //200
      console.log(arguments[1]);//200
    }
    a = b(1,2,3);
    console.log(a); //undefined
    

    (2) arguments和形参之间的映射是以arguments的索引为基础完成的,arguments中有这个索引浏览器会完成和对应的形参变量中的映射机制搭建,如果形参比arguments中的个数多,那么多出来的形参是无法和arguments中对应的索引建立关联的

    function fn(x,y){
      arguments[0] = 100;
      console.log(x);//100
      y=200;
      console.log(arguments[1]);//undefinde
    }
    fn(10);
    

    (3)arguments和形参的映射机制是建立在函数执行后形参赋值的一瞬间,不能手动绑定映射

    function fn(x,y){
      arguments[1] = 300;
      console.log(arguments);//Arguments [0: 10, 1: 300]
      console.log(y);//undefinde
    }
    fn(10);
    

    js在严格模式下

    在当前作用域的第一行添加
    "use strict"
    当前作用域中即开启了js严格模式

    "use strict"
    function fn(x,y){
      arguments[0] = 100;
      console.log(x);//10
      y=200;
      console.log(arguments[1]);//undefinde
    }
    fn(10);
    

    js严格模式下arguments不会产生映射机制,同时arguments.callee不能使用

    相关文章

      网友评论

          本文标题:关于js arguments和形参的映射机制

          本文链接:https://www.haomeiwen.com/subject/jgznlqtx.html