欢迎光临散文网 会员登陆 & 注册

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

2023-07-17 16:37 作者:Agonie_bili  | 我要投稿

改变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


千锋教育JavaScript全套视频教程(10天学会Js,前端javascrip的评论 (共 条)

分享到微博请遵守国家法律