• 新人补钙系列教程之:Function类的重要方法apply()


    实际用途:有些时候,需要动态更改函数中的默认指向当前对象内部域(this),指向到其他对象中时,需要用到apply(),如果在脚本实际执行前,无法知道要传递的参数的数量,那么这种方法通常很有用。

    1. apply () 方法 
    2. AS3 function apply(thisObject:Object, argArray:Array = null):void
    复制代码

    我们知道,每个function最终在执行时,都要有一个上下文环境,也就是this指针在函数执行时,到底指向谁的问题?

    1. var tmpObj:Object = new Object();
    2. tmpObj.addSalary = function(addSalary:uint):void{
    3.         trace("姓名:",this.name,",原工资:",this.salary,",新工资:",this.salary + addSalary);
    4. };
    复制代码

    这里我们动态的给 tmpObj对象定义了一个addSalary方法,注意addSalary方法体中的this,如果我们用

    1. tmpObj.name = "jimmy.yang";
    2. tmpObj.salary = 3000;
    3. tmpObj.addSalary(500);//姓名: tmpObj.yang ,原工资: 3000 ,新工资: 3500
    复制代码

    这样调用时,this指针默认就是指向tmpObj的,所以this.name自然就是tmpObj.yang,而this.salary自然也就是3000,这不废话么?

    但是我们可以借助Function类的apply以及call方法,显式改变this指针的指向!注意上面代码中的这一部分:

    1. var fuck:Object = new Object();
    2. fuck.name = "Mike";
    3. fuck.salary = 5000;        
    4. fuck.addSalary.call(tmpObj,1000);//姓名: fuck.yang ,原工资: 3000 ,新工资: 4000
    5. fuck.addSalary.call(mike,1000);//姓名: Mike ,原工资: 5000 ,新工资: 6000       
    复制代码

    这里我们又搞出了一个mike对象,而且并没有给他定义addSalary方法,但如果系统也要给mike同志临时加工资怎么办? 可以把tmpObj对象的addSalary方法应用在mike身上,即tmpObj.addSalary.call(mike,1000),最终mike得偿所愿,在原工资5000的基础上加了1000,就成了工资6000 (如果现实中加工资也这么容易就好了)

    至于apply方法,作用跟call一样,也可以用来改变函数执行时,this指针的指向,区别在于apply方法要求第二个参数必须是数组形式,即:

    1. tmpObj.addSalary.apply(mike,[1100]);
    复制代码

    下面的示例演示 apply() 如何传递参数数组并指定 this 的值:

    1. function theFunction() { 
    2.     trace("this == myObj? " + (this == myObj)); 
    3.     trace("arguments: " + arguments); 
    4. // instantiate an object 
    5. var myObj:Object = new Object(); 
    6. // create arrays to pass as a parameter to apply() 
    7. var firstArray:Array = new Array(1,2,3); 
    8. var secondArray:Array = new Array("a", "b", "c"); 
    9. // use apply() to set the value of this to be myObj and send firstArray 
    10. theFunction.apply(myObj,firstArray); 
    11. // output:  
    12. // this == myObj? true 
    13. // arguments: 1,2,3 
    14. // use apply() to set the value of this to be myObj and send secondArray 
    15. theFunction.apply(myObj,secondArray); 
    16. // output:  
    17. // this == myObj? true 
    18. // arguments: a,b,c
    复制代码
  • 相关阅读:
    pt-align的用法简要记录
    percona-toolkit 3.0.13 简单安装记录
    mysql8.0.17复制搭建及其gtid的1062和1032异常
    percona-xtrabackup-8.0.7简单快捷使用
    8.0.17 MySQL Community Server 二进制手工安装
    mysql参数sql_log_bin配置
    ERROR 1040 (08004): Too many connections
    MongoDB 副本集+分片 认证方式搭建
    属性配置文件详解(2)(十七)
    属性配置文件详解(1)(十六)
  • 原文地址:https://www.cnblogs.com/keng333/p/2299764.html
Copyright © 2020-2023  润新知