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

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

  • 下面是一个异步提交表单,并异步回调并通过call()函数实现给回调函数动态传递参数的过程。
function addSelectOption(selectId, optionValue, optionText, className){
var oSelect = document.getElementById(selectId); if(oSelect){
var option = document.createElement("option");
option.value = optionValue;
option.text = optionText; className = className == "undefined" ? "" : className; try{
option.setAttribute("class", className);
oSelect.add(option,null);
} catch(e){
option.setAttribute("className", className);
oSelect.add(option);
}
return option;
}
return null;
} /*窗口配置*/
var dialogSetting = {
        refrain    : 0,
        queue     : []
}; /*在selectId上绑定事件*/
$("#selectId > option").eq(0).click({
newDialog(url, this, jsonParse);
});
function newDialog(url, obj, fnCallback){
    art.dialog({
        title    : '欢迎',
        content    : document.getElementById("dialogBody"),
        ok        : function () {
/*异步提交函数*/
            postDataToServer(url, obj, fnCallback);
            return false;
        },
        okValue: '提  交',
        cancelValue: '关 闭',
        cancel: function () {
            $("#data").val("");
        }            
    });    
    
    return false;
}
 
/*提交表单数据到服务端*/
function postDataToServer(url, obj, fnCallback){
    var message     = "";
    var dataValue     = document.getElementById("data").value;
    
    if(dataValue.length == 0){
        message = "请填写内容!";
        $("#lbl_error").html(message);
        
        return false;
    }
    
    /*判断是否允许重复*/
    if(dialogSetting.refrain == 0){
        if(("," + dialogSetting.queue.join(",") + "," ).indexOf(","+ dataValue +",") >=0){
            message = "提交内容已存在,不允许出现重复!";
            $("#lbl_error").html(message);
            return false;
        }
    }
    
    $.post(url,{
        data : dataValue    
    }).success(function(responseData, textStatus, jqXHR) {
        eval("var rtnJson="+ responseData + ";");
        
        if(rtnJson.state == "1"){
            /*将提交的内容插入队列*/
            var permitName = rtnJson.dataName;
            dialogSetting.queue.push(permitName);
            
            fnCallback.call(obj, obj, rtnJson);
            
            message = "数据提交成功!";
        }else{
            message = "数据提交失败,请重新尝试";
        }
    }).error(function(XMLHttpRequest, textStatus  , errorThrown) {
        message = "网络通讯异常,请重新尝试登录!";
    }).complete(function(data) {     
        $("#lbl_error").html(message);    
    });         
} function jsonParse(obj, json){    
    if(obj && json.state == 1){
        var option = document.createElement("option");
        option.text     = json.dataName;
        option.value     = json.dataKey;
        
        document.getElementById("gather").add(option,obj);  
        
        /*选中指定的option*/
        selSpecialOption("selectId", document.getElementById("selectId").options.length - 2);        
    }
}

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

fnCallback.call(obj, obj, rtnJson);

等同于

jsonParse.call($("#selectId > option").eq(0),$("#selectId > option").eq(0),rtnJson)
其中第一个$("#selectId > option").eq(0)为call调用的上下文,第二个$("#selectId > option").eq(0)为jsonParse需要的参数

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

fnCallback.apply(obj, [obj, rtnJson]);

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. asp.net 登陆后在ashx处理程序中获取不到Session

    登录后存储Session,另一个页面Ajax请求 ashx页面,发现无法获取到Session,Session is NULL  使用“IReadOnlySessionState”这个接口就可以

  2. 【网络流24题】No.8 机器人路径规划问题

    [题意] 机器人 Rob 可在一个树状路径上自由移动. 给定树状路径 T 上的起点 s 和终点 t, 机器人 Rob 要从 s 运动到 t. 树状路径 T 上有若干可移动的障碍物. 由于路径狭窄, 任 ...

  3. 【BZOJ 2005】[Noi2010]能量采集 (容斥原理| 欧拉筛+ 分块)

    能量采集 Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋 ...

  4. Golang全接触

    满打满算, 从好友推荐Golang至发文时, 使用Golang已经有1年多了. 这种时间对于C/C++ Java这些老者来说, 简直是菜鸟级别的经验 但作为新生代语言的特点就是实战. Golang这一 ...

  5. Rewriting History with Git Rebase

    http://code.tutsplus.com/tutorials/rewriting-history-with-git-rebase--cms-23191 1. Rebasing for a Li ...

  6. 剧烈变化的移动互联网O2O

  7. 你所不知道的C++

    C++与C的不同 C++从诞生之初就号称和C是兼容的,正是这种兼容,使C++得以迅猛发展,然而也正是这种兼容,让C++背上了沉重的历史包袱.且不论其利弊,让我们来看看C++在兼容C的那部分中,与C语言 ...

  8. 畅通工程 HDOJ--1863

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. Linux和Windows下的进程管理总结

    在Windows和Linux下都可以很方便地列出当前运行的进程.Windows下可以使用组合键CTRL+ALT+DEL打开任务管理器,在进程选项卡中就列举出了当前运行的所有进程,除此之外还可以在命令行 ...

  10. storyboard ID

    The storyboard ID is a String field that you can use to create a new ViewController based on that st ...