在javascript开发过程中,如果有看过几个javascirpt代码库,就会发现经常使用到call()和apply()函数,call()和aplly()结合javascript允许传递函数名,这种便利性在javascript开发过程中是毋庸置疑的。call()和apply()函数的实现作用是一样的,只不过call()是逐个传递参数,而apply()允许传递参数数组,这个完全根据实际需要进行选择。

call()和apply()的第一个参数是代码执行的上下文。当call()和apply()函数的第一个参数传递为null时,则这个时候的上下文为window.call()和apply()函数在使用上比较难理解一点,如果能够理解透了将非常的喜欢使用。

  • 下面是一个异步提交表单,并异步回调并通过call()函数实现给回调函数动态传递参数的过程。
  1. function addSelectOption(selectId, optionValue, optionText, className){
  2. var oSelect = document.getElementById(selectId);
  3.  
  4. if(oSelect){
  5. var option = document.createElement("option");
  6. option.value = optionValue;
  7. option.text = optionText;
  8.  
  9. className = className == "undefined" ? "" : className;
  10.  
  11. try{
  12. option.setAttribute("class", className);
  13. oSelect.add(option,null);
  14. } catch(e){
  15. option.setAttribute("className", className);
  16. oSelect.add(option);
  17. }
  18. return option;
  19. }
  20. return null;
  21. }
  22.  
  23. /*窗口配置*/
  24. var dialogSetting = {
  25.         refrain    : 0,
  26.         queue     : []
  27. };
  28.  
  29. /*在selectId上绑定事件*/
  30. $("#selectId > option").eq(0).click({
  31. newDialog(url, this, jsonParse);
  32. });
  33. function newDialog(url, obj, fnCallback){
  34.     art.dialog({
  35.         title    : '欢迎',
  36.         content    : document.getElementById("dialogBody"),
  37.         ok        : function () {
  38. /*异步提交函数*/
  39.             postDataToServer(url, obj, fnCallback);
  40.             return false;
  41.         },
  42.         okValue: '提  交',
  43.         cancelValue: '关 闭',
  44.         cancel: function () {
  45.             $("#data").val("");
  46.         }            
  47.     });    
  48.     
  49.     return false;
  50. }
  51.  
  52. /*提交表单数据到服务端*/
  53. function postDataToServer(url, obj, fnCallback){
  54.     var message     = "";
  55.     var dataValue     = document.getElementById("data").value;
  56.     
  57.     if(dataValue.length == 0){
  58.         message = "请填写内容!";
  59.         $("#lbl_error").html(message);
  60.         
  61.         return false;
  62.     }
  63.     
  64.     /*判断是否允许重复*/
  65.     if(dialogSetting.refrain == 0){
  66.         if(("," + dialogSetting.queue.join(",") + "," ).indexOf(","+ dataValue +",") >=0){
  67.             message = "提交内容已存在,不允许出现重复!";
  68.             $("#lbl_error").html(message);
  69.             return false;
  70.         }
  71.     }
  72.     
  73.     $.post(url,{
  74.         data : dataValue    
  75.     }).success(function(responseData, textStatus, jqXHR) {
  76.         eval("var rtnJson="+ responseData + ";");
  77.         
  78.         if(rtnJson.state == "1"){
  79.             /*将提交的内容插入队列*/
  80.             var permitName = rtnJson.dataName;
  81.             dialogSetting.queue.push(permitName);
  82.             
  83.             fnCallback.call(obj, obj, rtnJson);
  84.             
  85.             message = "数据提交成功!";
  86.         }else{
  87.             message = "数据提交失败,请重新尝试";
  88.         }
  89.     }).error(function(XMLHttpRequest, textStatus  , errorThrown) {
  90.         message = "网络通讯异常,请重新尝试登录!";
  91.     }).complete(function(data) {     
  92.         $("#lbl_error").html(message);    
  93.     });         
  94. }
  95.  
  96. function jsonParse(obj, json){    
  97.     if(obj && json.state == 1){
  98.         var option = document.createElement("option");
  99.         option.text     = json.dataName;
  100.         option.value     = json.dataKey;
  101.         
  102.         document.getElementById("gather").add(option,obj);  
  103.         
  104.         /*选中指定的option*/
  105.         selSpecialOption("selectId", document.getElementById("selectId").options.length - 2);        
  106.     }
  107. }
  1.  

在上面的例子中,fnCallback回调函数就是jsonParse函数,jsonParse有两个参数,因此call()函数中需要传递相应的两个参数,同时由于call()的第一个参数是指定上下文对象,而这个例子中的上下文其实就是下拉id为selectId的第一个option对象,即参数obj = $("#selectId > option").eq(0)。因此

  1. fnCallback.call(obj, obj, rtnJson);
  2.  
  3. 等同于
  4.  
  5. jsonParse.call($("#selectId > option").eq(0),$("#selectId > option").eq(0),rtnJson)
  6. 其中第一个$("#selectId > option").eq(0)为call调用的上下文,第二个$("#selectId > option").eq(0)为jsonParse需要的参数

在apply()函数中实现以上的结果就是

  1. fnCallback.apply(obj, [obj, rtnJson]);
  2.  
  3. jsonParse.call($("#selectId > option").eq(0),[$("#selectId > option").eq(0),rtnJson])

javascript中的call()和apply应用的更多相关文章

  1. Javascript中call函数和apply函数的使用

    Javascript 中call函数和apply的使用: Javascript中的call函数和apply函数是对执行上下文进行切换,是将一个函数从当前执行的上下文切换到另一个对象中执行,例如: so ...

  2. Javascript 中的 call 和 apply

    发表于 2012年02月1日 by 愚人码头   原文链接:http://www.css88.com/archives/4431 JavaScript 中通过call或者apply用来代替另一个对象调 ...

  3. javascript中call函数与apply

    javascript中的call方法使当前对象可以调用另一个对象的方法,即改变this的指向内容 var first_object = { num: 42 }; var second_object = ...

  4. javascript 中caller,callee,call,apply 的概念[转载]

    在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments : 该对象代表正在执行的函数和调用它的函数的参数. [function.]argument ...

  5. 理解和运用javascript中的call及apply

    call是为了改变函数上下文context而存在的,换言之,就是改变函数内部this的指向.因为javascript存在[定义时上下文],[运行时上下文]及[上下文]是可以改变的.例如:var fun ...

  6. javascript 中的call和apply

    一.作用及应用场景 call和apply是Function的方法,他的第一个参数是this,第二个是Function的参数.call 和 apply 都是为了改变某个函数运行时的 context 即上 ...

  7. JavaScript中的call()、apply()与bind():

    关于call()与apply(): 在JavaScript中,每个函数都有call与apply(),这两个函数都是用来改变函数体内this的指向,并调用相关的参数. 看一个例子: 定义一个animal ...

  8. 理解JavaScript中的call和apply方法

    call方法 总的来说call()有这几种作用:1.可以借用另一个对象的方法.2.改变this的指向(重要).3.将arguments数组化.下面详细介绍这三种作用: 1.可以借用另一个对象的方法:当 ...

  9. JavaScript中的call、apply、bind方法的区别

    在JavaScript 中,this的指向是动态变化的,很可能在写程序的过程中,无意中破坏掉this的指向,所以我们需要一种可以把this的含义固定的技术,于是就有了call,apply 和bind这 ...

  10. 简单理解Javascript中的call 和 apply

    javascript中面向对像的能力是后来加进来的, 为了兼容性, 所以整出了很多奇特的东西, function Animal(){ this.name = "Animal"; t ...

随机推荐

  1. 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)

    [题目] Atlantis Problem Description There are several ancient Greek texts that contain descriptions of ...

  2. Java RMI远程方法调用

    RMI(远程接口调用) 1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程引用层(Remote Reference Layer)和传 ...

  3. POJ 2075 Tangled in Cables 最小生成树

    简单的最小生成树,不过中间却弄了很久,究其原因,主要是第一次做生成树,很多细节不够熟练,find()函数的循环for判断条件是 pre[i]>=0,也就是遇到pre[i]==-1时停止,i就是并 ...

  4. iOS开发控制器之间传值的几种小方法

    在IOS开发中或面试中,经常会遇到,两个或者多个控制器之间传值的问题 ,总结的集中方法仅供参考! 问题 :将B控制器中的textField 输入内容,传到A控制器中的label上显示出来,如何传值? ...

  5. jquery mobile 前言

    引用js: <link rel="stylesheet" href="../jquery.mobile-1.1.0/jquery.mobile-1.1.0.css& ...

  6. centOS 下解压 rar zip 文件

    闲话不说,centos上如何安装rar.unrar在线解压缩软件呢?如果您的centos是32位的,执行如下命令: wget http://www.rarsoft.com/rar/rarlinux-3 ...

  7. Bootstrap+MetroNic_1.5.4 Head meta

    Bootstrap+MetroNic_1.5.4 HTML <meta> 标签设定含义: <meta http-equiv="X-UA-Compatible" c ...

  8. Qualcomm 8X camera daemon进程浅析

    Camera 先看一下抽象层的主要流程: 首先启动一个守护进程 int qcamsvr_start(void)( qcamsvr.c) { 1. server_fd = open(server_dev ...

  9. Java设计模式之装饰模式趣谈

    本文由码农网 – 鲁阿皓原创,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 前情提要:http://blog.csdn.net/baidu_30889437/article/details/ ...

  10. ab apache Benchmarking中链接的写法 记得加上/

    C:\wamp\bin\apache\Apache2.2.21\bin>ab.exe -n5 -c5 http://www.baidu.com ab.exe: invalid URL Usage ...