1.利用函数下面的方法call,apply,bind
1.1.call方法:改变this指向的,第一个参数就是新的this指向,从第二个参数开始表示函数自身的参数。
// let a = 1000; //变量,let声明的变量不是window的属性。 // var b = 2000; //变量,var声明的变量是window的属性。 // console.log(a); //1000; // console.log(window.a); //undefined,let声明的变量不是window的属性。 // console.log(b); //2000; // console.log(window.b); //2000;var声明的变量是window的属性 // const obj = { // a: 100, // b: 200, // showa() { // console.log(this.a); // console.log(this.b); // } // }; // obj.showa(); // this->obj 输出100 200 // obj.showa.call(window); //this->window 输出undefined,2000最外层函数的 this 指向 window ,在严格模式下 this 指向 undefined;
// function fn() { // alert(this); // } // fn(); //this->window,严格模式下面指向undefined // fn.call(1) //this->1call第一个参数就是新的this指向,从第二个参数开始表示函数自身的参数。
// sum.call(window, 3, 7); //undefined+3+7 = NaN // sum.call(obj, 3, 7); // 100+3+7 = 1101.2.apply方法:改变this指向的,第一个参数就是新的this指向,第二个参数是数组或者类数组,里面放函数自身的参数。
// let a = 1000; //变量,let声明的变量不是window的属性。 // const obj = { // a: 100, // showa() { // console.log(this.a); // } // }; // function sum(x, y) { // console.log(this.a + x + y); // }call第一个参数就是新的this指向, 从第二个参数开始表示函数自身的参数。
apply第一个参数就是新的this指向, 第二个参数是数组或者类数组,里面放函数自身的参数。区别是某些特殊情况下,apply占一点点写法优势。
// sum.apply(window, [3, 7]); //undefined+3+7 = NaN // sum.apply(obj, [3, 7]); // 100+3+7 = 110计算1+2+3+……10的和
// let a = 1000; //变量,let声明的变量不是window的属性。 // const obj = { // a: 100, // showa() { // console.log(this.a); // } // }; // function sum(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10) { // console.log(this.a + n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9 + n10) // } // sum.call(obj, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); //155 // sum.apply(obj, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); //155 // let str = ‘hello’; // console.log(Array.prototype.slice.call(str)); // console.log(Array.prototype.slice.apply(str));1.3.bind方法:改变this指向的,第一个参数就是新的this指向, 从第二个参数开始表示函数自身的参数,仅返回函数体。
// let a = 1000; //变量,let声明的变量不是window的属性。 // const obj = { // a: 100, // showa() { // console.log(this.a); // } // }; // function sum(x, y) { // console.log(this.a + x + y); // } // sum.bind(window, 3, 7)(); //undefined+3+7 = NaN // sum.bind(obj, 3, 7)(); // 100+3+7 = 110