关于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存在映射机制(映射:相互之间影响)
- 第一个形参变量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不能使用