//对于 arguments和this, 每个函数都有自己独有的arguments和this, 且不进行链式查找
//arguments是什么?
//答:1:arguments是收到的实参副本
//2:收到实参收集起来,放到一个arguments对象里
//在词法分析中, 首先按形参形成AO的属性,值为undefined
//当实参传来时, 再修改AO的相应属性.
//t(a,b,c){},
//调用时: t(1,2,3,4,5) 个参数
//此时 , AO属性只有a,bc,3个属性, arguments里有1,3,3,4,5, 所有的值
//对于超出形参个数之外的实参, 可以通过arguments来获得
//3:arguments 的索引 从 0, 1,2,....递增,与实参逐个对应
//4:arguments.length 属性代表实参的个数
//5:Arguments一定不是数组, 是长的比较像数组的一个对象,虽然也有length属性
//6:Arguments每个函数都会有,因此,arguemnts只会在内部找自身的arguments,
//无法引用到外层的arguments
//function t1(a,b,c)
//{
// alert(arguments[1]) //2
// alert(arguments[4]) //5
// alert(arguments[5]) //6
// alert(a+"==="+b+"==="+c); //1,2,3
//}
//t1(1, 2, 3, 4, 5, 6);
//alert(arguments[1]) //无法引用到外层的arguments
//call,apply,bind 区别:
//在JS中,这三者都是用来改变函数的this对象的指向的
// 1、都可以利用后续参数传参。
//2、第一个参数都是this要指向的对象。
//3、都是用来改变函数的this对象的指向的。
// 例如:
var zs = {
name : "张三",
gender : "男",
age : ,
say : function() {
alert(this.name + " , " + this.gender + " ,今年" + this.age);
}
}
var lisi = {
name : "李四",
gender : "女",
age :
}
zs.say(); //显示的肯定是张三 , 男 , 今年20。 那么如何用zs的say方法来显示lisi的数据呢。
// call的用法:
zs.say.call(lisi);
//apply的用法:
zs.say.apply(lisi);
//而bind需要这样:
zs.say.bind(lisi)();
// 如果直接写zs.say.bind(lisi)是不会有任何结果的,call和apply都是对函数的直接调用,而bind方法返回的仍然是一个函数,因此后面还需要()来进行调用才可以。
//再看看下面例子
var zs = {
name : "张三",
gender : "男",
age : ,
say : function(school,grade) {
alert(this.name + " , " + this.gender + " ,今年" + this.age + " ,在" + school + "上" + grade);
}
}
var lisi = {
name : "李四",
gender : "女",
age :
}
//可以看到say方法多了两个参数,我们通过call/apply的参数进行传参。
// 对于call来说是这样的
zs.say.call(lisi,"清华大学","一年级");
// 而对于apply来说是这样的
zs.say.apply(lisi,["清华大学","一年级"]);
// 区别:call后面的参数与say方法中是一一对应的,而apply的第二个参数是一个数组,数组中的元素是和say方法中一一对应的,这就是两者最大的区别。
//那么bind怎么传参呢?它可以像call那样传参。
zs.say.bind(lisi,"清华大学","一年级")();
//但是由于bind返回的仍然是一个函数,所以我们还可以在调用的时候再进行传参。
zs.say.bind(lisi)("清华大学","一年级");