call apply bind 总结

5 篇文章 0 订阅
本文详细介绍了JavaScript中函数调用时this的指向,包括普通函数、构造函数、对象方法、事件绑定、定时器和立即执行函数等场景。同时,对比了call、apply和bind的区别和应用场景,如call用于实现继承,apply处理数组,bind用于改变函数内部this指向而不立即执行。此外,还通过示例展示了如何使用它们来改变函数执行上下文。
摘要由CSDN通过智能技术生成

call apply bind 总结

前提:理解this的指向

这些 this 的指向,是当我们调用函数的时候确定的。 调用方式的不同决定了this 的指向不同
一般指向我们的调用者.

调用方式this指向
普通函数调用window
构造函数调用实例对象。原型对象里面的方法也是实例对象
对象方法调用该方法所属对象
事件绑定方法绑定该事件的元素
定时器函数调用window
立即执行函数window
  • 普通函数this指向window
	// 函数的不同调用方式决定了this的指向不同
        // 1.普通函数 this 指向window
        function fn() {
            console.log('普通函数的this ---> ' + this);

        }
        fn();   //普通函数的this ---> [object Window]
        window.fn();  //普通函数的this ---> [object Window]
  • 构造函数this指向 实例对象
	// 2.构造函数 this 指向ldh这个实例对象 ,原型对象里面的this 指向的也是ldh这个实例对象
        function Star() {
            console.log('star');

        }
        Star.prototype.sing = function () { };
        var ldh = new Star();
  • 对象方法this指向 所属对象
	// 3.对象方法 this 指向的是对象o
        var o = {
            sayHi: function () {
                console.log('对象方法 this ---> ' + this);
            },
            sayBye: function () {
                console.log('对象方法 this ---> ' + this);

            }
        }
        o.sayBye();     //对象方法 this ---> [object Object]
  • 事件绑定this指向 绑定事件的元素
    //4.绑定事件函数:this指向绑定事件的元素
        var btn = document.querySelector('button');
        btn.onclick = function () {
            console.log('绑定事件函数的 this --->' + this);    //绑定事件函数的 this --->[object HTMLButtonElement]

        };
  • 定时器函数this指向 window
	//5.定时器函数:this指向window
        window.setTimeout(function () {
            console.log('定时器的 this ---> ' + this);

        });    //定时器的 this ---> [object Window]
  • 立即执行函数this 指向 window
	//6.立即执行函数:this指向window
        (function () {
            console.log('立即执行函数的 this ---> ' + this);

        })();   //立即执行函数的 this ---> [object Window]
        //立即执行函数先于其他函数执行

相同点:

​ 都可以改变函数内部的this指向.

区别点:

  1. call 和 apply 会调用函数, 并且改变函数内部this指向.
  2. call 和 apply 传递的参数不一样, call 传递参数 aru1, aru2…形式 apply 必须数组形式[arg]
  3. bind 不会调用函数, 可以改变函数内部this指向.
    主要应用场景:
  4. call 经常做继承.
  5. apply 经常跟数组有关系. 比如借助于数学对象实现数组最大值最小值
  6. bind 不调用函数,但是还想改变this指向. 比如改变定时器内部的this指向.
  • call()
		//1.call():实现继承
        var o = {
            name: 'andy'
        }
        function fn(a, b) {
            console.log(this);  //window
            console.log(a + b);  //[object Object]2

        };
        fn(1, 2);   //对象方法this指向对象o
        fn.call(o, 2, 3)    //call改变this指向,name
        // call第一个可以调用函数,第二个可以改变函数内的指向
        // 实现继承
  • apply()
		//2.apply() 应用 运用的意思
        var o = {
            name: 'andy'
        };
        function fn(arr) {
            console.log(this);  //Object
            console.log(arr);   //red

        }
        fn.apply(o, ['red']);
        //1.也是调用函数 第二个可以改变函数内部的this指向
        //2.但它的参数必须是数组【伪数组】
        //3.apply 的主要应用比如借助数学内置对象求数组最大值Math。max()


        var arr = [99, 100, 1, 0, 45, 62];
        var max = Math.max.apply(Math, arr);
        var min = Math.min.apply(Math, arr);
        console.log('最大值:' + max, '最小值:' + min);
  • bind()
<body>
    <div>
        <button>click</button>
        <button>click</button>
        <button>click</button>
    </div>
    <script>
        //3.bind() 绑定 捆绑的意思。
        // bind() 方法不会调用函数。但是能改变函数内部this 指向
        var o = {
            name: 'andy'
        };
        function fn(a, b) {
            console.log(this);
            console.log(a + b);

        };
        var f = fn.bind(o);  //没有输出,只是绑定不会调用
        f();  //因此f已经成为了一个函数。 返回由指定的 this 值和初始化参数改造的原函数拷贝
        //1.不会调用原来的函数  可以改变原来函数内部的this指向
        //2.返回的原函数改变this之后产生的新函数

        //3.如果有的函数我们不需要立即调用,但是又想改变这个函数内部的this指向此时用bind
        //4.我们有一个按钮,当我们点击了之后,仅仅用这个按钮,2秒钟之后开启这个按钮
        var btns = document.querySelectorAll('button');
        for (var i = 0; i < btns.length; i++) {
            btns[i].onclick = function () {
                this.disabled = true;   //这个this指向的是 btn这个按钮
                setTimeout(function () {
                    this.disabled = false;  //定时器函数里面的this指向的是window,window没有disabled属性
                }.bind(this), 2000);  //这个this指向的是btn这个对象
            }
        }
    </script>
</body>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮怪鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值