数组追加

      //用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);//
var numbers=[25,456,86,-45];
var maxNum=Math.max.call(Math,25,456,86,-45)//传入的一个个参数
console.log(maxNum);//

验证是否是数组(前提是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);//
log(1,2);//1 1

 用apply的方法

       function log()
{
console.log.apply(console,arguments);
}
log(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); //
});
}
}
foo.eventBind();          
         //bind的写法
        var foo = {
bar : 1,
eventBind: function(){
$('.someClass').on('click',function(event) {
// Act on the event
console.log(this.bar); //
}.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); //
console.log(a()); //
// 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方法。

-------------------------------------------------------------------------------------------------2018-06-04-----------------------------------------------------------------------------------------------------------------------

        var obj={
name:"Jack",
getName:function(age,gender){
console.log(this.name)
console.log(age)
console.log(gender)
}
}
obj.getName(12,'男')//obj自己调用 var People={
name:"Jane"
}
obj.getName.call(People,15,'男') //call
obj.getName.apply(People,[15,'男']) //apply
var a = obj.getName.bind(People,15,'男') // bind返回的是一个回调函数
a()

当bind和call复用的时候

                 function fn(name){
this.name=name
console.log(this.name)
}
var a = fn.bind.call(fn,{},'Jack'); //第一个参数是bind要调用的函数,第二个参数是call函数执行函数执行时的上下文,依次是传入函数的参数
a()
//等同于
var orgBindFun = Function.prototype.bind;
var b = orgBindFun.call(fn,null,'Jack')
b()

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

  1. JavaScript学习(2)call&apply&bind&eval用法

    javascript学习(2)call&apply&bind&eval用法 在javascript中存在这样几种特别有用的函数,能方便我们实现各种奇技淫巧.其中,call.bi ...

  2. call,apply,bind的用法

    关于call,apply,bind这三个函数的用法,是学习javascript这门语言无法越过的知识点.下边我就来好好总结一下它们三者各自的用法,及常见的应用场景. 首先看call这个函数,可以理解成 ...

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

    这篇文章主要给大家对比分析了javascript中call,apply,bind三个函数的用法,非常的详细,这里推荐给小伙伴们.   关于call,apply,bind这三个函数的用法,是学习java ...

  4. js call().apply().bind()的用法

    function Person(age) { this.age = age; } Person.prototype.sayHi = function (x, y) { console.log((x + ...

  5. call,apply,bind的用法及区别

    <script> function test(){ console.log(this) } // new test(); //函数调用call方法的时候,就会执行. //call的参数:第 ...

  6. ES5-call,apply,bind的用法

    区别bind()与call()和apply()? 1. Function.prototype.bind(obj) : * 作用: 将函数内的this绑定为obj, 并将函数返回2. 面试题: 区别bi ...

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

    理解 JavaScript this 文章中已经比较全面的分析了 this 在 JavaScript 中的指向问题,用一句话来总结就是:this 的指向一定是在执行时决定的,指向被调用函数的对象.当然 ...

  8. 如何实现new,call,apply,bind的底层原理。

    new做了什么? new是用来实例化对象的,当new了一个对象后 1.创建一个新对象 2.将构造函数的作用域赋值给新对象(this指向新对象) 3.执行构造函数里面的代码(为这个新对象添加属性) 4. ...

  9. js中call、apply、bind的用法

    原文链接:http://www.cnblogs.com/xljzlw/p/3775162.html var zlw = { name: "zlw", sayHello: funct ...

  10. js中bind的用法,及与call和apply的区别

    call和apply的使用和区别不再做阐述,可以参考我的另一篇随笔<JavaScript中call和apply方法的使用>(https://www.cnblogs.com/lcr-smg/ ...

随机推荐

  1. java基础 ------- 多重循环 and break与continue

    -----  什么是多重循环 ----   打印数列 public class ForEx { public static void main(String[] args){ for(int i = ...

  2. JAVA中字符串操作几种方式对比

    @参考文章 方法及原理: 方法1:a=a+b实际上另开辟一个空间c=a+b;然后将c的引用赋给a 方法2:a += b实际上是建立一个StringBuffer,然后调用append(),最后再将Str ...

  3. LAB2

    任务1: 效果:HelloWorld 好像完全按视频做就行了 学会了:把glassfish改好了,能跑 没学会:视频里的解说不懂在干嘛,得再看看 任务2 效果:intersetingpicture要求 ...

  4. 用nodejs搭建类似于C++的服务器后台.类似网易pomelo

    实际的情况,用nodejs跑业务,非常的快,只要用好其无阻塞和回调这两点,处理速度真的是杠杠的. 从年初开始,我用nodejs搭建了类似C++的服务器后台,也想和做同样的事情的朋友分享,本服务平台因为 ...

  5. yii框架 隐藏index.php 以及美化URL(pathinfo模式访问)

    首先我们分步骤来: 安装好 yii 以后  我们看到的url地址如下所示: http://www.3w.com/MyApp/backend/web/index.php?r=site%2Flogin 我 ...

  6. BZOJ4377 Kurs szybkiego czytania \ Luogu 3589[POI2015]KUR - 数学思维题

    Solution 我又双叒叕去看题解啦$QAQ$, 真的想不到鸭 输入 $a$ 和 $n$ 互质, 所以满足 $a \times i \ mod \ n$ $(0<=i<n)$ 肯定是不重 ...

  7. python 05集合

    1.集合 特性:可变的,不同元素组成,无序,集合中元素类型必须是不可变(数字,元组,字符串) 形式:s={1,"good",(2,3)} 方法:add(), clear()清空, ...

  8. [Bat]如何彻底关闭每个盘符默认的共享$(即使重启也有效)

    Windows启动时都会默认打开admin$ ipc$ 和每个盘符的共享,对于不必要的默认共享,一般都会把它取消掉,可当又需要打开此默认共享时,又该从哪里设置呢,一般来说有两个地方,MSDOS命令和计 ...

  9. C++标准库第二版笔记 2

    C++标准库第二版笔记 2 微小但重要的语法提升 template表达式内的空格: vector< list<int> >; // OK in each C++ version ...

  10. MFC的停靠窗口中插入对话框,在对话框中添加控件并做控件自适应

    单文档程序添加了停靠窗口后,可能会在停靠窗口中添加一些控件.在这里我的做法是在对话框上添加控件并布局,然后将这个对话框插入到停靠窗口中. 步骤 1.插入对话框,在对话框中放入控件(我的为树形控件),并 ...