zoukankan      html  css  js  c++  java
  • apply()和call()的区别

     这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值.

     apply()接收两个参数:一个参数是在其中运行的作用域,另一个是参数数组(可以是Array实例,也可以是arguments对象).

    实例:

    function sum(num1,num2) {
    	return num1+num2;
    }
    
    function applySum1(num1,num2) {
     return	sum.apply(this,arguments);
     
    }
    
    function applySum2(num1,num2) {
     return	sum.apply(this,[num1,num2]);
     
    }
    
    console.log(applySum1(10,10));//20
    console.log(applySum2(10,10));//20
    

     

    call()方法,第一个参数和apply()一样,是在其中运行的作用域即this;和apply()不同的是,call()方法中的其余的参数必须直接传给函数,即在使用call()方法时参数必须逐个的列出来.

    实例:

    function sum(num1,num2) {
    	return num1+num2;
    }
    
    //function applySum1(num1,num2) {
    // return	sum.apply(this,arguments);
    // 
    //}
    //
    //function applySum2(num1,num2) {
    // return	sum.apply(this,[num1,num2]);
    // 
    //}
    
    function callSum1(num1,num2) {
    	return sum.call(this,num1,num2);
    }
    console.log(callSum1(10,10));//20
    

    apply和call的区别只是除了第一个this参数外,其余参数的传递方式不一样,apply的其余的参数可以用Array实例和arguments对象传递,call的其余参数必须逐个列出.两者最后得到的结果一样.

    apply和call真正的用处是扩充函数的作用域:

    实例1:

    //一般方法
    color = "red";
    var o = {color:"blue"};
    function sayColor() {
    	console.log(this.color);
    }
    
    sayColor();//red
    o.sayColor();//报错
    o.sayColor = sayColor;//给对象o添加一个sayColor方法,然后让其指针指向全局作用域中的sayColor函数
    o.sayColor();//blue
    

      

    实例2(call方法和apply方法一样效果):

    color = "red";
    var o = {color:"blue"};
    function sayColor() {
    	console.log(this.color);
    }
    
    //sayColor();//red
    //o.sayColor();//报错
    //o.sayColor = sayColor;//给对象o添加一个sayColor方法,然后让其指针指向全局作用域中的sayColor函数
    //o.sayColor();//blue
    
    //采用apply或call方法解决对象和方法耦合的问题
    sayColor.call();//red
    sayColor.call(o);//blue
    sayColor.call(this);//undefined
    sayColor.call(window);//window is not defined
    

    测试结果:

    最后的测试结果和《javascript高级程序第3版》中的有点不一致(原因待分析):

    8-16补充:全局对象window,本身就是浏览器中的对象,所以在命令行窗口下测试是不能得到书中的结果的.

                    浏览器下测试结果:

                    

  • 相关阅读:
    条件语句的用法
    PHP取得当前文档所在的目录
    郁闷,一个语句调试很久
    PHP图片上传加水印(转)
    PHP多行多列分页
    ASP得到当前文件所在目录
    “树人杯”暨第三届辽宁科技大学校园程序设计竞赛正赛D IP检测(绿)
    “树人杯”暨第三届辽宁科技大学校园程序设计竞赛正赛E 成绩统计图(红)
    [面试备] 暴搜 or 二分图的经典升级 : hdu 1045 Fire Net 示例 [ 讲解之用 ]
    《C++ Primer》 第04章 [ 数组和指针 ]
  • 原文地址:https://www.cnblogs.com/yy95/p/5773785.html
Copyright © 2011-2022 走看看