zoukankan      html  css  js  c++  java
  • 新人补钙系列教程之: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
    复制代码
  • 相关阅读:
    捡来的一个大数模版。很好用
    小探catlan数
    hdu1060数学题求幂最左边的数
    食物相克
    工作 瓶颈 思路问题
    从用户态open到内核驱动实现
    内核代码 结构
    I2C原理
    asm
    man 2 3 5 普通命令(1) 函数库(3)
  • 原文地址:https://www.cnblogs.com/keng333/p/2299764.html
Copyright © 2011-2022 走看看