call_callback - CSDN
精华内容
参与话题
  • js call()方法的作用

    千次阅读 2018-07-27 15:51:19
    JS的call方法的作用解释,简单易懂 2016年09月27日 15:49:15 阅读数:14300 先看看关于call()的官方解释,“调用一个对象的一个方法,以另一个对象替换当前对象。”,看了这样的解释,或许让你更摸不着头脑了。看...

    JS的call方法的作用解释,简单易懂

    2016年09月27日 15:49:15

    阅读数:14300

    先看看关于call()的官方解释,“调用一个对象的一个方法,以另一个对象替换当前对象。”,看了这样的解释,或许让你更摸不着头脑了。看例子:

     

    
     
    1. var x = "我是全局变量";    //定义全局变量x

    2. function a(){         //定义函数类结构a  

    3. this.x = "我是在函数类结构a中声明的哦";

    4. }

    5. //定义普通函数,弹出当前指针所包含的变量x的值

    6. function f(){

    7. alert (this.x);

    8. }

    9. //返回值为“我是在函数类结构a中声明的哦”

    10. f.call(new a());

    我的理解是,f.call(new a())就是把函数(其实也是对象)f复制到被调用对象“new a()”下面去解析,事实上和下面这段代码的解析结果一样:

     

    
     
    1. function a(){

    2.   this.x = "我是在函数类结构a中声明的哦";

    3.   alert(this.x);

    4. }

    5. a();

    只不过此时变量X的作用域不同而已,咿…看起来好像有点继承的味道哦,难道不是吗?在上例中,f完全被构造函数a的实力对象继承了,如果说这还不足以说明a.call(b)是一种继承模式,那么再看一个更具有继承味道的用法吧。

     

    
     
    1. function f(){

    2. this.a ="a";

    3. this.b = function(){

    4. alert("b");

    5. }

    6. }

    7. function e(){

    8. f.call(this);

    9. }

    10. var c = new e();

    11. alert(c.a); //弹出a

    12. c.b(); //弹出b

    在这个例子中,只要会使用浏览器的朋友,都能看得出来e完全继承了f的属性和方法,否则是无法解释的,因为在e中并没有定义属性a和b,那么按常理推断在e的实例对象c中,并不会出现这两个属性。

    转载地址:https://blog.csdn.net/ywl570717586/article/details/52681392/

    展开全文
  • call apply 和 bind的区别

    千次阅读 2017-09-19 11:24:26
    apply 和call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向。 JavaScript 的一大特点是,函数存在「定义时上下文」和...

    apply 和call


    在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向。

    JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念。

    eg:
    function fruits() {}
     
    fruits.prototype = {
        color: "red",
        say: function() {
            console.log("My color is " + this.color);
        }
    }
     
    var apple = new fruits;
    apple.say();    //My color is red

    但是如果我们有一个对象banana= {color : "yellow"} ,我们不想对它重新定义 say 方法,那么我们可以通过 call 或 apply 用 apple 的 say 方法:

    banana = {
        color: "yellow"
    }
    apple.say.call(banana);     //My color is yellow
    apple.say.apply(banana);    //My color is yellow

    所以,可以看出 call 和 apply 是为了动态改变 this 而出现的,当一个 object 没有某个方法(本栗子中banana没有say方法),但是其他的有(本栗子中apple有say方法),

    我们可以借助call或apply用其它对象的方法来操作。

    apply 和 call 区别:


    对于 apply、call 二者而言,作用完全一样,只是接受参数的方式不太一样。例如,有一个函数定义如下:

    var func = function(arg1, arg2) {
         
    };

    就可以通过如下方式来调用:

    func.call(this, arg1, arg2);
    func.apply(this, [arg1, arg2])

    其中 this 是你想指定的上下文,他可以是任何一个 JavaScript 对象(JavaScript 中一切皆对象),call 需要把参数按顺序传递进去,而 apply 则是把参数放在数组里。 
     

    JavaScript 中,某个函数的参数数量是不固定的,因此要说适用条件的话,当你的参数是明确知道数量时用 call 。

    而不确定的时候用 apply,然后把参数 push 进数组传递进去。当参数数量不确定时,函数内部也可以通过 arguments 这个伪数组来遍历所有的参数。


    常用用法:

    1.数组之间的追加

    var array1 = [12 , "foo" , {name "Joe"} , -2458]; 
    var array2 = ["Doe" , 555 , 100]; 
    Array.prototype.push.apply(array1, array2); 
    /* array1 值为  [12 , "foo" , {name "Joe"} , -2458 , "Doe" , 555 , 100] */

    2.获取数组中最大值和最小值

    var  numbers = [5, 458 , 120 , -215 ]; 
    var maxInNumbers = Math.max.apply(Math, numbers),   //458
        maxInNumbers = Math.max.call(Math,5, 458 , 120 , -215); //458

    number 本身没有 max 方法,但是 Math 有,我们就可以借助 call 或者 apply 使用其方法。

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

    functionisArray(obj){ 
        return Object.prototype.toString.call(obj) === '[object Array]' ;
    }

    4.类(伪)数组使用数组方法

    var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));

    Javascript中存在一种名为伪数组的对象结构。比较特别的是 arguments 对象,还有像调用 getElementsByTagName , document.childNodes 之类的,它们返回NodeList对象都属于伪数组。不能应用 Array下的 push , pop 等方法。


    但是我们能通过 Array.prototype.slice.call 转换为真正的数组的带有 length 属性的对象,这样 domNodes 就可以应用 Array 下的所有方法了。


    深入理解运用apply、call


    下面就借用一道面试题,来更深入的去理解下 apply 和 call 。

    定义一个 log 方法,让它可以代理 console.log 方法,常见的解决方法是:

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

    上面方法可以解决最基本的需求,但是当传入参数的个数是不确定的时候,上面的方法就失效了,这个时候就可以考虑使用 apply 或者 call,注意这里传入多少个参数是不确定的,所以使用apply是最好的,方法如下:

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

    接下来的要求是给每一个 log 消息添加一个"(app)"的前辍,比如:

    log("hello world");    //(app)hello world

    该怎么做比较优雅呢?这个时候需要想到arguments参数是个伪数组,通过 Array.prototype.slice.call 转化为标准数组,再使用数组方法unshift,像这样:

    function log(){
      var args = Array.prototype.slice.call(arguments);
      args.unshift('(app)');
     
      console.log.apply(console, args);
    };


    bind


    说完了 apply 和 call ,再来说说bind。bind() 方法与 apply 和 call 很相似,也是可以改变函数体内 this 的指向。


    MDN的解释是:bind()方法会创建一个新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以创建它时传入 bind()方法的第一个参数作为 this,传入 bind() 方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。


    直接来看看具体如何使用,在常见的单体模式中,通常我们会使用 _this , that , self 等保存 this ,这样我们可以在改变了上下文之后继续引用到它。 像这样:

    var foo = {
        bar : 1,
        eventBind: function(){
            var _this = this;
            $('.someClass').on('click',function(event) {
                /* Act on the event */
                console.log(_this.bar);     //1
            });
        }
    }

    由于 Javascript 特有的机制,上下文环境在 eventBind:function(){ } 过渡到 $('.someClass').on('click',function(event) { }) 发生了改变,上述使用变量保存 this 这些方式都是有

    用的,也没有什么问题。当然使用 bind() 可以更加优雅的解决这个问题:

    var foo = {
        bar : 1,
        eventBind: function(){
            $('.someClass').on('click',function(event) {
                /* Act on the event */
                console.log(this.bar);      //1
            }.bind(this));
        }
    }

    在上述代码里,bind() 创建了一个函数,当这个click事件绑定在被调用的时候,它的 this 关键词会被设置成被传入的值(这里指调用bind()时传入的参数)。因此,这里我们

    传入想要的上下文 this(其实就是 foo ),到 bind() 函数中。然后,当回调函数被执行的时候, this 便指向 foo 对象。再来一个简单的栗子:


    var bar = function(){
    console.log(this.x);
    }
    var foo = {
    x:3
    }
    bar(); // undefined
    var func = bar.bind(foo);
    func(); // 3



    这里我们创建了一个新的函数 func,当使用 bind() 创建一个绑定函数之后,它被执行的时候,它的 this 会被设置成 foo , 而不是像我们调用 bar() 时的全局作用域。


    有个有趣的问题,如果连续 bind() 两次,亦或者是连续 bind() 三次那么输出的值是什么呢?像这样:


    var bar = function(){
        console.log(this.x);
    }
    var foo = {
        x:3
    }
    var sed = {
        x:4
    }
    var func = bar.bind(foo).bind(sed);
    func(); //?
     
    var fiv = {
        x:5
    }
    var func = bar.bind(foo).bind(sed).bind(fiv);
    func(); //?

    答案是,两次都仍将输出 3 ,而非期待中的 4 和 5 。原因是,在Javascript中,多次 bind() 是无效的。更深层次的原因, bind() 的实现,相当于使用函数在内部包了一个 call / apply ,第二次 bind() 相当于再包住第一次 bind() ,故第二次以后的 bind 是无法生效的。


    apply、call、bind比较


    那么 apply、call、bind 三者相比较,之间又有什么异同呢?何时使用 apply、call,何时使用 bind 呢。简单的一个栗子:

    var obj = {
        x: 81,
    };
     
    var foo = {
        getX: function() {
            return this.x;
        }
    }
     
    console.log(foo.getX.bind(obj)());  //81
    console.log(foo.getX.call(obj));    //81
    console.log(foo.getX.apply(obj));   //81


    三个输出的都是81,但是注意看使用 bind() 方法的,他后面多了对括号。


    也就是说,区别是,当你希望改变上下文环境之后并非立即执行,而是回调执行的时候,使用 bind() 方法。而 apply/call 则会立即执行函数。


     


    再总结一下:

    • apply 、 call 、bind 三者都是用来改变函数的this对象的指向的;
    • apply 、 call 、bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文;
    • apply 、 call 、bind 三者都可以利用后续参数传参;
    • bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 。





    展开全文
  • call命令

    万次阅读 2016-11-03 09:10:13
    一、call命令总结 【1】call命令简介  学过汇编或C的朋友,肯定都知道call指令表示什么意思。其实,在这里它的意思也是一样的。在批处理脚本中,call命令用来从一个批处理脚本中调用另一个批处理脚本。  语法:...

    一、call命令总结

    【1】call命令简介

      学过汇编或C的朋友,肯定都知道call指令表示什么意思。其实,在这里它的意思也是一样的。在批处理脚本中,call命令用来从一个批处理脚本中调用另一个批处理脚本。

      语法: call [ [Drive:] [Path] FileName [BatchParameters]] [:label [arguments]]

      参数: [Drive:][Path] FileName  指定要调用的批处理程序的位置和名称。Filename 参数必须是.bat 或 .cmd 扩展名的类型文件。

      BatchParameters 指定批处理程序所需的命令行信息(即参数项)。   

      调用另一个批处理程序,并且不终止父批处理程序(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。   

      call 命令接受用作跳转目标的标签。如果在脚本或批处理文件外使用call,它将不会在命令行起作用。

    【2】call命令应用

      1. 基本应用。应用示例:新建两个文本文件,一个命名为call1,修改文件的类型为bat,用Notepad++打开编辑内容为:

    1 echo running call1

      另一个命名为call2,修改文件类型为bat,用Notepad++打开编辑内容为:

    1 @echo off2 echo start3 call call1.bat4 echo running call25 echo end6 pause

      双击执行call2文件,执行结果如下所示:

      过程解析:

      可以很清晰的看到,call调用类似于函数调用的执行逻辑:call2相当于执行主函数,在其执行过程中,需要调用到call1函数,当call1执行结束后,call2主函数再继续执行本身的命令,直至整个过程结束。

      注意:call1脚本第一行没有再写@echo off语句。因为call2第一行已经关闭了命令回显状态,当call2调用call1时,此设置同样有效,由此可更深入理解调用。

      2. 调用标签。应用示例:新建两个文本文件,一个命名为call3,修改文件的类型为bat,用Notepad++打开编辑内容为:

    复制代码
    1 @echo off2 call :label3 echo 14 echo 25 6 :label7 echo 38 echo 4
    复制代码

      另一个命名为call4,修改文件类型为bat,用Notepad++打开编辑内容为:

    1 @echo off2 call call3.bat3 pause

      双击执行call4文件,执行结果如下所示:

      过程解析:

      看到这个结果什么感觉?让你想起了什么呢?想不起来啥?一看你若有所茫的样子,就知道你把goto与这个搞混了!请看下文call命令与goto命令的区别。

      3. 调用带参数的批处理。应用示例:新建两个文本文件,一个命名为call7,修改文件的类型为bat,用Notepad++打开编辑内容为:

    1 echo %1 %22 echo %3

      另一个命名为call8,修改文件类型为bat,用Notepad++打开编辑内容为:

    1 @echo off2 call call7.bat hello world 1233 dir c:\4 pause

      双击执行call8文件,执行结果如下所示:

    【3】call命令与goto命令的区别

      call命令的应用示例2中,我们看到了call命令对跳转标签的调用,注意调用时必须在标签名前加冒号,而goto是直接跟标签名。

      关于goto命令不懂的可以参见同系列随笔《批处理命令——goto 和 :》

      同上例,我们再看看goto的执行效果:新建两个文本文件,一个命名为call5,修改文件的类型为bat,用Notepad++打开编辑内容为:

    复制代码
    1 @echo off2 goto label3 echo 14 echo 25 6 :label7 echo 38 echo 4
    复制代码

      另一个命名为call6,修改文件类型为bat,用Notepad++打开编辑内容为:

    1 @echo off2 call call5.bat3 pause

      双击执行call6文件,执行结果如下所示:

    展开全文
  • JS中的 call( ) 方法

    万次阅读 多人点赞 2018-11-09 22:54:21
    this总是指向调用某个方法的对象,但是使用call()和apply()方法时,就会改变this的指向。 call.(thisOject, arg1 ,arg2 ...) 我们单独说说call(),因为apply()和call差不多,只不过apply第二个参数必须传入的是一个...

    this总是指向调用某个方法的对象,但是使用call()和apply()方法时,就会改变this的指向。

    call.(thisOject, arg1 ,arg2 ...)

    我们单独说说call(),因为apply()和call差不多,只不过apply第二个参数必须传入的是一个数组,而call 第二个参数可以是任意类型。

    obj1.(method).call(obj2,argument1,argument2)
    如上,call的作用就是把obj1的方法放到obj2上使用,后面的argument1..这些做为参数传入。

    function add (x, y) 
    { 
        console.log (x + y);
    } 
    function minus (x, y) 
    { 
        console.log (x - y); 
    } 
    add.call (minus , 1, 1);    //2 

    这个例子中的意思就是用 add 来替换 minus ,add.call(minus ,1,1) == add(1,1) ,所以运行结果为:console.log (2); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。

    A.call( B,x,y ):就是把A的函数放到B中运行,x 和 y 是A方法的参数。

    用call来实现继承,用this可以继承myfunc1中的所有方法和属性。

    function myfunc1(){
        this.name = 'Lee';
        this.myTxt = function(txt) {
            console.log( 'i am',txt );
        }
    }
    
    function myfunc2(){
        myfunc1.call(this);
    }
    
    var myfunc3 = new myfunc2();
    myfunc3.myTxt('Geing'); // i am Geing
    console.log (myfunc3.name);	// Lee
    

     

    展开全文
  • call()的用法

    千次阅读 2016-10-14 10:52:09
    转自:...call() 方法在使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法. 注意:该方法的作用和 apply() 方法类似,只有一个区别,就是call()方法接受的是若干
  • js中call()方法的用法

    千次阅读 2019-02-20 21:47:25
    call方法可以用来代替一个对象调用一个方法,call方法可以将一个函数的对象上下文从初始化改为新的对象,也就是括号里面的原本的对象改为call()前面的对象、即用thisobj代替call前面的东西,最终用thisobj这个对象去...
  • call()与apply()的作用与区别

    万次阅读 多人点赞 2018-06-26 19:57:47
    每个函数都包含两个非继承而来的方法:apply()和call()。; call与apply都属于Function.prototype的一个方法,所以每个function实例都有call、apply属性; 作用 call()方法和apply()方法的作用相同:改变this...
  • __call__

    2019-07-27 09:21:27
    一、__call__ 一、__call__ 对象后面加括号时,触发执行。 注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()() class ...
  • 【Python】__call__

    2019-03-11 14:50:19
    Python中的有趣语法,只要在定义类型的时候,实现__call__函数,这个类型就成为可调用的。换句话说,我们可以把这个类型的对象当做函数来使用,相当于重载了括号运算符。来看一个例子: class TestCall(object): ...
  • __call__()

    2018-04-03 08:16:05
    一个类实例可以通过__call__()变成一个可调用对象例如: 把Person 类变成一个可调用对象:class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender def __call__(self,...
  • call、ret、retf 指令详解

    万次阅读 2016-03-26 22:57:26
    call、ret、retf指令详解本文讲解针对NASM编译器,8086处理器的call、ret、retf 指令。对于其他编译器和保护模式下的80x86,指令用法类似,可以作为参考。
  • JS中的call()方法和apply()方法用法总结

    万次阅读 多人点赞 2017-05-05 19:08:35
    JacvaScript中的call()方法和apply()方法, 1. 每个函数都包含两个非继承而来的方法:call()方法和apply()方法。 2. 相同点:这两个方法的作用是一样的。都是在特定的作用域中调用函数,等于设置函数体内this对象的...
  • Maximum call stack size exceeded

    万次阅读 2019-05-23 09:44:51
    错误描述 直接上错误截图: 错误解析 以上错误的意思是 "超出最大调用堆栈大小" 出现这种错误最常见的原因是:在代码中的某个地方,您正在调用一个函数,该函数又调用另一个函数,依此类推,直到达到调用...
  • 【2018.11.12 11:34 更新,重新排版】 【欢迎关注微信公众号“陶晨毅”,代码之外的资料分享学习打卡站】 【先说明,本博客不解决任何具体问题,只是初学时为看懂报错信息写的笔记示例】 如果一个错误出现后没有...
  • Telephony MO CALL/IMS CALL

    千次阅读 2016-04-07 22:17:45
    本篇文章介绍Telephony的MO(Mobile Original) call 的流程。 1.拨号App中输入号码并拨号,Android的源生的拨号App为Dialer(packages/apps/Dialer) 下面看一下在输入完号码,点击拨号按钮后,Dialer中都做了什么...
  • Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 1317, in do_open encode_chunked=req.has_header('Transfer-encodi...
  • Android Call分析(一) ---- Call对象详解

    万次阅读 多人点赞 2017-01-11 10:20:41
    Call(通话)相关的内容也是属于Telephony模块,Call整体上可以分成两类: 1. CS call,其中CS全称是Circuit Switch,我们平常打电话走的就是CS的流程。 2. IMS PS call,其中PS全称是Packet Switch,走IMS流程的...
  • Traceback (most recent call last):

    万次阅读 2019-05-12 14:13:15
    |Traceback (most recent call last) EOFError: EOF when reading a line Traceback (most recent call last): File "C:\Users\31368\Desktop\post-1.py", line 24, in <module> response=urllib.reques...
  • 目录 1 函数的定义方式 1.1 函数声明 ...4.1.1 新的函数调用方式apply和call方法 4.1.2 apply和call可以改变this的指向 4.2 call,apply使用 4.3 bind 4.4 总结 5 函数的其它成员(了解) 6
  • Android O版本Call对象解析

    千次阅读 2018-03-05 20:50:19
    在Android8.0中的Call.java有三个地方 frameworks\opt\telephony\src\java\com\android\internal\telephony telephoney frameworks frameworks\base\telecomm\java\android\telecom telecomm frameworks ...
1 2 3 4 5 ... 20
收藏数 1,361,108
精华内容 544,443
关键字:

call