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,本身就是浏览器中的对象,所以在命令行窗口下测试是不能得到书中的结果的.

                    浏览器下测试结果:

                    

  • 相关阅读:
    Python Revisited Day 13 (正则表达式)
    Python Revisited Day 06 (面向对象程序设计)
    Python Revisited (变量)
    Python Revisited Day 05(模块)
    Python Revisited Day 04 (控制结构与函数)
    Python Revisited Day 03 (组合数据类型)
    Numpy
    Python Revisited Day 01
    Python3使用openpyxl读写Excel文件
    Python3操作YAML文件
  • 原文地址:https://www.cnblogs.com/yy95/p/5773785.html
Copyright © 2011-2022 走看看