Arguments是个类似数组但不是数组的对象,说他类似数组是因为其具备数组相同的访问性质及方式,能够由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性length。还有就是arguments对象存储的是实际 传递给函数的参数,而不局限于函数声明所定义的参数列表,而且不能显式创建 arguments 对象。
arguments是个类数组结构,它存储了函数在调用时传入的所有实参, 通过访问它的length属性可以得到其中保存的实参的个数,并可以通过arguments[n]按顺序取出传入的每个参数(n=1,2,…,arguments.length-1)。
function fn(arg1, arg2){ // 'use strict';
arguments[1]="1"
console.log(arguments);
console.log(arg2);//2
console.log(arg1 === arguments[0]); // true
console.log(arg2 === arguments[1]); // false
console.log(arg3 === arguments[2]); // true
}
fn(1,2,3,4,5); // 调用
// length是获取形参个数
console.log(fn.length);//2
【函数 this 的指向】
在非严格模式下而且是浏览器环境下,函数的 this 指向 window;
而在严格模式下, this 的值是 undefined。
// 非严格模式
function fn(){console.log(this);}
fn(); // global || Window
//严格模式
'use strict';
function fn(){console.log(this);}
fn(); // undefined
.当函数被一个对象当成方法调用时, 这个函数的 this 会指向调用它的对象;
// 定义一个对象
let wz = {
getThis (){ // 定义一个函数
return this; // 这个函数返回自己的 this 指向
}
}
let wzthis = wz.getThis(); // 通过对象调用函数得到函数的 this 指向
console.log(wzthis === xm); // true, 函数的this指向调用它的对象本身
函数的call() 和 apply()
let wz = {
name: '王者',
sayName(){console.log(this.name);}
};
wz.sayName(); // 对象调用函数输出 '王者'
let xg = {name: '峡谷'};
对象 xh 只有 name 属性, 没有 sayName 属性, 如果想让 xh 也使用 sayName 函数来输出自己的名字, 那么就要在调用 sayName 时让它的 this 指向小红, 以达到 this.name 等于 xh.name 的目的。 这个目的就可以通过 call 和 apply 两个函数来实现。 以call 函数为例来实现这个需求, 只需要这样写就可以了:
wz.sayName.call(xg); // 峡谷
xm.sayName.apply(xg); // 峡谷
call 和 apply 的区别:
call 和 apply 的区别仅仅是要传给fn的参数的形式不同:对于apply,传给fn的参数argument是个数组,数组由所有参数组成;对于call,传给fn的参数argument直接是所有参数的排列, 直接一个个写入就可以。