1、call方法
- 语法:函数名.call(调用者,实参1…)
- 作用:函数被借用时,会立即执行,并且函数体内的this会指向调用者(借用者)
- 代码:
1 function fn(name, age) {
2 this.name = name;
3 this.age = age;
4 console.log(this == obj); //==>true
5 }
6
7 // 对象字面量
8 var obj = {};
9 fn.call(obj, '李四', 11); //==>fn中的this指向obj
2 、apply方法
- 语法:函数名.apply(调用者,[实参1,实参2,…]) ==>参数以数组的形式
- 作用:函数被借用是,会立即执行,并且函数体内的this会指向调用者(借用者)
- 代码:
1 function fn(name, age) {
2 this.name = name;
3 this.age = age;
4 console.log(this == obj); //==>true
5 }
6
7 // 对象字面量
8 var obj = {};
9 fn.call(obj, ['李四', 11]); //==>fn中的this指向obj
3、 bind方法
- 语法:函数名.bind(调用者,实参1…)
- 作用:函数被借用时,不会立即执行,而是返回一个新的函数。需要自己手动调用新的函数。
- 代码:
1 function fn(name, age) {
2 this.name = name;
3 this.age = age;
4 console.log(this == obj); //==>true
5 }
6
7 // 对象字面量
8 var obj = {};
9 var newFn = fn.bind(obj, '李四', 11);
10 newFn();
11 // fn.bind(obj, '李四', 11)();
4 、使用
代码:
1 // this指向window
2 var name = 'window';
3 var obj = {name = 'obj'};
4 setTimeout(function(){
5 console.log(this.name); //==>输出window
6 },2000)
7 // this指向obj
8 var name = 'window';
9 var obj = {name = 'obj'};
10 setTimeout(function(){
11 console.log(this.name); //==>输出obj
12 }.bind(obj),2000) // bind不会立即执行
- 伪数组借用数组的push方法实现增加
- 代码:
1 var arr = [10,20,30,40];
2 // arr.push(50); // push为数组中的方法
3 var obj = {
4 0:10,
5 1:20,
6 2:30,
7 3:40,
8 length:4
9 }
10 // console.log(arr instanceof Array); ==>true
11 // console.log(obj instanceof Array); ==>false
12 // Array.prototype.push ==>构造函数Array的原型中的push方法
13 Array.prototype.push.call(obj,50); // ==>改变push中this指向为obj