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

2019-01-04  本文已影响14人  D_R_M
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存在映射机制(映射:相互之间影响)

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不能使用

上一篇下一篇

猜你喜欢

热点阅读