//对于 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 : 20, say : function() { alert(this.name + " , " + this.gender + " ,今年" + this.age); } } var lisi = { name : "李四", gender : "女", age : 25 } 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 : 20, say : function(school,grade) { alert(this.name + " , " + this.gender + " ,今年" + this.age + " ,在" + school + "上" + grade); } } var lisi = { name : "李四", gender : "女", age : 25 } //可以看到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)("清华大学","一年级");