this指向的几种情况以及js简单实现call、apply、bind___六卿

简介: 本文讨论了JavaScript中`this`的指向规则,并提供了`call`、`apply`和`bind`方法的简单实现,用于改变函数的`this`指向。

this指向的几种情况

普通Function调用的this指向

           myFun()
           function myFun(){
   
               console.log(this) //window
           }

对象中方法中this指向

        let obj = {
   
            name:'zjq',
            age:"18",
            habby(){
   
                console.log(this.name,this)
            }
        }
        obj.habby() //指向obj

构造函数中的this指向

        function A(name, age){
   
                this.name= name;
                this.age = age;
                this.habby = function(){
   
                    console.log(this.name,this.age,this)  //指向实例化之后的对象
                }
            }
           let Ac = new A('zjq',18)
            Ac.habby()

箭头函数的this指向

        const A = () => {
   
            console.log(this)
        }
        let obj = {
   
            name: 'zjq',
            age: "18",
            A,
            B(){
   
                console.log(this,'B')
            }
        }
        console.log(obj.A())  //window
        console.log(obj.B())  //obj

普通函数我们都知道是谁调用指向谁,是在调用的时候确定的,但是箭头函数指向外层作用域,但是obj身上没有this这个变量,直到最外层window,跟着作用域往上找了
在这里插入图片描述
在这里插入图片描述

简单实现改变this指向的三种方法

call

        Function.prototype.mySelfCall = function (obj, ...arrList) {
   
            obj = obj ? Object(obj) : window
            let that = this; //前边的函数
            obj.fn = that;
            obj.fn(...arrList)
            delete obj.fn
        }

apply

        Function.prototype.mySelfApply = function (obj, arrList) {
   
            obj = obj ? Object(obj) : window
            let that = this; //前边的函数
            obj.fn = that;
            obj.fn(...arrList)
            delete obj.fn
        }

bind


        Function.prototype.mySelfBind = function (obj, ...arrList) {
   
            obj = obj ? Object(obj) : window
            let that = this; //前边的函数
            obj.fn = that;
            return () => {
    obj.fn.mySelfCall(obj, ...arrList); delete obj.fn }
        }

测试

        function A(name, age) {
   
            this.name = name;
            this.age = age;
            this.habby = function (...num) {
   
                console.log(this.name, this.age, this, ...num)  //指向实例化之后的对象
            }
        }
        let Ac = new A('zjq', 18)
        Ac.habby.mySelfCall({
    name: 111, age: 222 }, 1, 2, 3, 4)
        Ac.habby.mySelfApply({
    name: 333, age: 444 }, [1, 2, 3, 4, 5, 6, 7, 8])
        Ac.habby.mySelfBind({
    name: 555, age: 666 }, 1, 2, 3, 4)()

在这里插入图片描述

目录
相关文章
|
5天前
|
JavaScript
js的this与call,apply,bind
js的this与call,apply,bind
|
2月前
|
JavaScript
js【详解】call()、apply()、bind()方法
js【详解】call()、apply()、bind()方法
32 6
|
4月前
|
前端开发 JavaScript
前端 JS 经典:apply、call、bind
前端 JS 经典:apply、call、bind
89 0
|
4月前
|
JavaScript
call、apply、bind的使用场景区分(js的问题)
call、apply、bind的使用场景区分(js的问题)
20 0
|
JavaScript 前端开发 API
JavaScript中的new,bind,call,apply的原理及简易实现
JavaScript中的new,bind,call,apply的原理及简易实现
92 0
|
4月前
|
JavaScript
JS中call()、apply()、bind()改变this指向的原理
JS中call()、apply()、bind()改变this指向的原理
|
10月前
|
JavaScript 前端开发
javascript函数的call、apply和bind的原理及作用详解
javascript函数的 call、apply和bind 本质是用来实现继承的,专业点说法就是改变函数体内部 this 的指向,当一个对象没有某个功能时,就可以用这3个来从有相关功能的对象里借用过来
48 0
|
10月前
|
JavaScript 前端开发
js中call 和 apply的区别
js中call 和 apply的区别
54 0
|
JavaScript 前端开发
JavaScript中的this指向,call、apply、bind的简单实现
JavaScript中的this指向,call、apply、bind的简单实现
54 0
|
JavaScript
js中apply和call方法的应用
js中apply和call方法的应用