zoukankan      html  css  js  c++  java
  • js中的call apply bind

    <!--如果call和apply的第一个参数写的是null,那么this指向的是Window对象-->
    call()
    a.call(b,参1,参2) // a替换b
    a.方法.call(b,[ ]) //a 有方法而b没
    a.call(this) //this-b 在b函数内将a全部调用 继承
    var b=new b(形参); b.方法(实参) //带参数调用
    说明: call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
    var a = {
    user:"追梦子",
    fn:function(){ //方法 function fn(){}
    console.log(this.user);
    }
    }
    var b = a.fn;
    b.call(a); / /拿出来,放回去
    call方法除了第一个参数以外还可以添加多个参数,如下:
    var a = {
    user:"追梦子",
    fn:function(e,ee){
    console.log(this.user);
    }
    }
    var b = a.fn;
    b.call(a,1,2); //追梦子
     
    1. apply() 语法:apply([thisObj[,argArray]]) 定义:应用某一对象的一个方法,用另一个对象替换当前对象。 说明: 如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数
    apply方法和call方法有些相似,它也可以改变this的指向
    var a = {
    user:"追梦子",
    fn:function(){
    console.log(this.user); //追梦子
    }
    }
    var b = a.fn;
    b.apply(a);
     
    同样apply也可以有多个参数,但是不同的是,第二个参数必须是一个数组,如下:
     
    var a = {
    user:"追梦子",
    fn:function(e,ee){
    console.log(this.user); //追梦子
    console.log(e+ee); //11
    }
    }
    var b = a.fn;
    b.apply(a,[10,1]); // b.call(a,10,1)
     
    或者
    var a = {
    user:"追梦子",
    fn:function(e,ee){
    console.log(this.user); //追梦子
    console.log(e+ee); //520
    }
    }
    var b = a.fn;
    var arr = [500,20]; //数组
    b.apply(a,arr);
     
    //注意如果call和apply的第一个参数写的是null,那么this指向的是window对象
    var a = {
    user:"追梦子",
    fn:function(){
    console.log(this); //Window ……
    }
    }
    var b = a.fn;
    b.apply(null);
     
    3 bind 绑定
    bind方法和call、apply方法有些不同,但是不管怎么说它们都可以用来改变this的指向。
    var a = {
    user:"追梦子",
    fn:function(){
    console.log(this.user);
    }
    }
    var b = a.fn;
    b.bind(a);
     
    我们发现代码没有被打印,这就是bind和call、apply方法的不同,实际上bind方法返回的是一个修改过后的函数。
    var a = {
    user:"追梦子",
    fn:function(){
    console.log(this.user);
    }
    }
    var b = a.fn;
    var c = b.bind(a);
    console.log(c); // function() { [native code] }
    那么我们现在执行一下函数c看看,能不能打印出对象a里面的user
    var a = {
    user:"追梦子",
    fn:function(){
    console.log(this.user); //追梦子
    }
    }
    var b = a.fn;
    var c = b.bind(a);
    c(); //a.fn();
    ok,同样bind也可以有多个参数,并且参数可以执行的时候再次添加,但是要注意的是,参数是按照形参的顺序进行的。
    var a = {
    user:"追梦子",
    fn:function(e,d,f){
    console.log(this.user); //追梦子
    console.log(e,d,f); //10 1 2
    }
    }
    var b = a.fn;
    var c = b.bind(a,10);
    c(1,2);
    call和apply都是改变上下文中的this并立即执行这个函数,bind方法可以让对应的函数想什么时候调就什么时候调用,并且可以将参数在执行的时候添加,这是它们的区别,根据自己的实际情况来选择使用。
  • 相关阅读:
    September 17th 2016 Week 38th Saturday
    【2016-09-16】UbuntuServer14.04或更高版本安装问题记录
    September 16th 2016 Week 38th Friday
    September 11th 2016 Week 38th Sunday
    September 12th 2016 Week 38th Monday
    September 10th 2016 Week 37th Saturday
    September 9th 2016 Week 37th Friday
    c++暂停
    八皇后问题
    ( 转转)Android初级开发第九讲--Intent最全用法(打开文件跳转页面等)
  • 原文地址:https://www.cnblogs.com/bjyx/p/11993246.html
Copyright © 2011-2022 走看看