js 中arguments,call,apply,bind的使用

时间:2023-03-08 15:47:32
 //对于 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)("清华大学","一年级");