arguments
- arguments是实参得集合(类数组集合,不管有没有设置形参,只要设置的形参,arguments就有值)
function fn() {
console.log(arguments)
}
fn(1,2,3)
链接: blog.csdn.net/qq_16339527…
2.映射机制
案例解析
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
/**
*EC(G)
* 变量提升:
* a
* b = 0x000000
*/
var a = 4
function b(x, y, a) {
/**
*EC(B)
* AO(B)
* x: 1
* y: 2
* a: 3
* 作用域链:<EC(B), EC(G)>
* 初始化THIS:window
* c初始化aruments:[1, 2, 3] => {0:1, 1:2, 2:3, length:3} 类数组
* 形参赋值:x = 1, y = 2, a = 3
* (在非严格模式下:把初始化的arguments和形参建立一个“映射”机制,只在这个阶段建立。 arguments集合中的每一项对应同样位置的形参)
*/
console.log(a) // 私有变量a => 3
arguments[2] = 10 // arguments[2]的值变了,也会‘映射给形参一份’
console.log(a) // 私有变量a => 10
}
a = b(1, 2, 3) // b函数没有返回值,全局a = undefined
console.log(a) //undefined
arguments实参集合(类数组集合)
映射机制是在代码执行之前建立的:
var a = 4;
function b(x, y, a) {
/**
* EC(B)
* 作用域链:<EC(B), EC(G)>
* 初始化this:window
* 初始化arguments:{0:1,1:2,length:2}:代码执行之前建立映射机制
* 变量提升:===
*
* 映射机制是在函数代码执行之前完成的,那会如果建立了映射就有映射,如果没有建立,
* 映射机制后续也不会再有了
*/
a = 3;
console.log(arguments[2]);// undefined
}
a = b(1, 2);
ES6:
function b(...args) {
console.log(arguments)
console.log(args)
}
b(1,2,3,4)