千锋教育JavaScript全套视频教程(10天学会Js,前端javascrip

改变this指向
一.call,apply,bind的区别 -
它们的作用是相同的,都是动态的修改当前函数内部的this的指向。
1.执行方式不同:
call和apply是改变后就立即执行函数,bind改变后不会立即执行;而是返回一个新的函数,需要再次调用。
function fn() {
console.log(this);
}
fn();//this->window
fn.call(1);//this->1 立即执行
fn.apply(1);//this->1 立即执行
fn.bind(1)()//this->1 再次调用
2.传参方式不同:
call 第一个参数this指向,从第二个参数开始就是函数的参数。
bind 第一个参数this指向,从第二个参数开始就是函数的参数,返回的是函数体,继续通过调用再次传入参数。
apply第一个参数this指向,第二个参数是数组,函数自身的参数放到数组里面。
var num = 1;//var声明的变量也是window的属性
function sum(a, b) {
console.log(this.num + a + b);
}
sum.call(window, 2, 3);//this.num = 1 结果6
sum.bind(window, 2, 3)();//this.num = 1 结果6
sum.bind(window)(2, 3,);//this.num = 1 结果6 继续通过调用再次传入参数
sum.apply(window, [2, 3]);//this.num = 1 结果6 这里不一样
3.修改this的性质不同
call、apply只是临时的修改一次,修改就是call和apply方法使用的那一次;当再次调用原函数的时候,它的指向还是原来的指向。
var obj = {
a: 100
}
var a = 1;//var声明的变量也是window的属性
function fn() {
console.log(this.a);
}
fn();//this->window 1
fn.call(obj);//100
fn.apply(obj);//100
// 当再次调用原函数的时候,它的指向还是原来的指向。
fn()//this->window 1
bind是永久修改函数this指向,但是它修改的不是原来的函数;而是返回一个修改过后新的函数,此函数的this永远被改变了,绑定了就修改不了。
var obj = {
a: 100
}
var a = 1;//var声明的变量也是window的属性
function fn() {
console.log(this.a);
}
var newFn = fn.bind(obj);//这里返回新函数,修改的就是返回的新函数的this
newFn(); //this->obj 100
newFn(); //this->obj 100
newFn(); //this->obj 100
newFn(); //this->obj 100
newFn.call(window);//修改返回的新函数,将其this指向window,但是无法修改,this继续指向obj 100
newFn.call(1);//修改返回的新函数,将其this指向1,但是无法修改,this继续指向obj 100
newFn.call(2);//修改返回的新函数,将其this指向2,但是无法修改,this继续指向obj 100
newFn.call(3);//修改返回的新函数,将其this指向3,但是无法修改,this继续指向obj 100