call、apply、bind的用法

数组追加

      //用apply拼接
            var arr1=[12,‘name:foo‘,2048];
            var arr2=[‘Joe‘,‘Hello‘];
            Array.prototype.push.apply(arr1,arr2);
            console.log(arr1);//(5) [12, "name:foo", 2048, "Joe", "Hello"]
            //用call拼接
            var arr1=[12,‘name:foo‘,2048];
            var arr2=[‘Joe‘,‘Hello‘];
            Array.prototype.push.call(arr1,arr2);
            console.log(arr1);//(4) [12, "name:foo", 2048, Array(2)]  Array(2) ["Joe", "Hello"]是arr2只占一位,然后在第三位下面又分2位

获取数组中的最大值和最小值

      //对比call和apply (参数明确时用call)
            var numbers=[25,456,86,-45];
            var maxNum=Math.max.apply(Math,numbers)//传入的是一个数组
            console.log(maxNum);//456
            var numbers=[25,456,86,-45];
            var maxNum=Math.max.call(Math,25,456,86,-45)//传入的一个个参数
            console.log(maxNum);//456

验证是否是数组(前提是toString()方法没有被重写过)

      var arr=[1,2,3,4,5];
            function isArray(obj){
                 return  Object.prototype.toString.call(obj) === ‘[object Array]‘ ;
            }
            isArray(arr);
            console.log(isArray(arr))//true

apply的用法

       function log(msg)  // 常规写法
            {
                console.log(msg);
            }
            log(1);//1
            log(1,2);//1 1

 用apply的方法

       function log()
            {
                console.log.apply(console,arguments);
            }
            log(1);//1
            log(1,2);//1 2

bind的用法

           //常规写法            var foo = {
                    bar : 1,
                    eventBind: function(){
                        console.log(this)
                        var _this = this;
                        $(‘.someClass‘).on(‘click‘,function(event) {
                        // Act on the event
                        console.log(_this.bar); //1
                        });
                    }
                }
            foo.eventBind();          
         //bind的写法        var foo = {
                    bar : 1,
                    eventBind: function(){
                        $(‘.someClass‘).on(‘click‘,function(event) {
                        // Act on the event
                        console.log(this.bar); //1
                        }.bind(this));
                    }
                }
              foo.eventBind();

bind() 创建了一个函数,当这个click事件绑定在被调用的时候,它的 this 关键词会被设置成被传入的值(这里指调用bind()时传入的参数)。因此,这里我们传入想要的上下文 this(其实就是 foo ),到 bind() 函数中。
然后,当回调函数被执行的时候, this 便指向 foo 对象。

案例

    var bar = function(){
                    console.log(this.x);
                }
            var foo = {
                x:3
            }
            var sed = {
                x:4
            }
            var func = bar.bind(foo).bind(sed);
                func(); //3  此时输出的为3

            var fiv = {
                x:5
            }
            var func = bar.bind(foo).bind(sed).bind(fiv);
            func(); //3 //此时输出的为3

在Javascript中,多次 bind() 是无效的。更深层次的原因,bind() 的实现,相当于使用函数在内部包了一个 call / apply,第二次 bind() 相当于再包住第一次 bind() ,故第二次以后的 bind 是无法生效的。
bind()返回的内容

       var obj = {
                    x: 81,
                };

            var foo = {
                    getX: function() {
                        return this.x;
                    }
            }
            var a = foo.getX.bind(obj); //81
            console.log(a()); //81
//          console.log(foo.getX.bind(obj)()); //81  call和apply是立即执行,而bind返回的是函数

call 方法

            //使用call方法调用匿名函数
            var peoples=[
                {name:‘Jane‘,age:16},
                {name:‘Maria‘,age:15}
            ]
            for(var i=0;i<peoples.length;i++){
                (function(i){
                    this.print=function(){
                        console.log(i+"----" +this.name+"---"+this.age);
                    }
                    this.print();
                }).call(peoples[i],i)
            }
      //使用call方法调用父构造函数
            function Product(name,price){
                this.name=name;
                this.price=price
                    if(price < 0){
                        throw RangeError(‘Connot create product‘+this.name+‘with a negative price‘);
                    }
                }
                function Food(name,price){
                    Product.call(this,name,price);
                    this.category=‘food‘;
                }
                var cheese = new Food(‘feta‘, 5);
                console.log(cheese);//Food {name: "feta", price: 5, category: "food"}

简单用法

          function cat(){
                }
                cat.prototype={
                     food:"fish",
                     say:function(){
                           alert("I love "+this.food);
                     }
                }
                var blackCat = new cat;
                blackCat.say();
                var whiteDog = {food:"bone"};
                console.log(whiteDog);
                blackCat.say.apply(whiteDog);

总结:

apply 、 call 、bind 三者都是用来改变函数的this对象的指向的;
apply 、 call 、bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文;
apply 、 call 、bind 三者都可以利用后续参数传参;

apply 、 call 会立刻执行,而bind的回调函数

apply传入的是数组apply(this,[argu1,argu2,argu3,argu4]),call是call(this,argu1,argu2,argu3,argu4),如果传入的参数个数是已知的,可以用call方法。如果个数未知,用apply方法。

时间: 2024-10-26 10:00:13

call、apply、bind的用法的相关文章

call,apply,bind的用法

关于call,apply,bind这三个函数的用法,是学习javascript这门语言无法越过的知识点.下边我就来好好总结一下它们三者各自的用法,及常见的应用场景. 首先看call这个函数,可以理解成"借用“,"请求".想像一下如下的情景:你孤单一人漂泊在外,有急事想往家里打电话,可是很不巧,手机欠费了,或者没电了,或者掉坑里了,总之你的手机就是用不成.可是你非打这个电话不可,于是你可以去借一下朋友的手机,或者借用一下邻居的手机,或者公用电话,这样呢,你就可以在自己没有手机可

javascript中call,apply,bind的用法对比分析

这篇文章主要给大家对比分析了javascript中call,apply,bind三个函数的用法,非常的详细,这里推荐给小伙伴们. 关于call,apply,bind这三个函数的用法,是学习javascript这门语言无法越过的知识点.下边我就来好好总结一下它们三者各自的用法,及常见的应用场景. 首先看call这个函数,可以理解成"借用“,"请求".想像一下如下的情景:你孤单一人漂泊在外,有急事想往家里打电话,可是很不巧,手机欠费了,或者没电了,或者掉坑里了,总之你的手机就是用

call,apply,bind的用法及区别

<script> function test(){ console.log(this) } // new test(); //函数调用call方法的时候,就会执行. //call的参数:第一个参数:方法执行的时候,方法中的this的指向.第二个参数:表示方法执行所需要的实际参数. var obj ={ name:"zhagafd"}; // test.call(obj,"hello"); //applly的参数:第一个参数:方法执行的时候,方法中this

理解 JavaScript call()/apply()/bind()

理解 JavaScript this 文章中已经比较全面的分析了 this 在 JavaScript 中的指向问题,用一句话来总结就是:this 的指向一定是在执行时决定的,指向被调用函数的对象.当然,上篇文章也指出可以通过 call() / apply() / bind() 这些内置的函数方法来指定 this 的指向,以达到开发者的预期,而这篇文章将进一步来讨论这个问题. 先来回顾一下,举个简单的例子: var leo = { name: 'Leo', sayHi: function() {

js中call、apply、bind的用法

今天看博客时,看到了这样的一段js代码: var bind = Function.prototype.call.bind(Function.prototype.bind); 我想突然看到这样的一段代码,即使js能力再强的人,可能也需要花点时间去理解.像我这样的菜鸟就更不用说了.其实,原文已经对这端代码做出了解释,但我还是想用我的想法去解释这段代码. 上面那段代码涉及到了call.bind,所以我想先区别一下call.apply.bind的用法.这三个方法的用法非常相似,将函数绑定到上下文中,即用

call,apply,bind的用法与区别

1.call/apply/bind方法的来源 首先,在使用call,apply,bind方法时,我们有必要知道这三个方法究竟是来自哪里?为什么可以使用的到这三个方法? call,apply,bind这三个方法其实都是继承自Function.prototype中的,属于实例方法. 1 console.log(Function.prototype.hasOwnProperty('call')) //true 2 console.log(Function.prototype.hasOwnPropert

别真以为JavaScript中func.call/apply/bind是万能的!

自从学会call/apply/bind这三个方法后我就各种场合各种使用各种得心应手至今还没踩过什么坑,怎么用?说直白点就是我自己的对象没有某个方法但别人有,我就可以通过call/apply/bind去调用执行别人家的方法,不太懂具体用法的同学可移至MDN学习一下Function.prototype.call() Function.prototype.apply() Function.prototype.bind() ,本文不讲解使用,但是这三个方法并不是万能的,并不一定会执行你想要的那个函数,因

call(),apply(),bind()与回调

1.call(),apply(),bind()方法 JavaScript 中通过call或者apply用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象.简单的说就是改变函数执行的上下文,这是最基本的用法.两个方法基本区别在于传参不同. call(obj,arg1,arg2,arg3); call第一个参数传对象,可以是null.参数以逗号分开进行传值,参数可以是任何类型. apply(obj,[arg1,arg2,arg3]); appl

JavaScript学习--Item9 call(),apply(),bind()与回调

1.call(),apply(),bind()方法 JavaScript 中通过call或者apply用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象.简单的说就是改变函数执行的上下文,这是最基本的用法.两个方法基本区别在于传参不同. call(obj,arg1,arg2,arg3); call第一个参数传对象,可以是null.参数以逗号分开进行传值,参数可以是任何类型. apply(obj,[arg1,arg2,arg3]); appl