javascript中的call()和apply应用
在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应用的更多相关文章
- Javascript中call函数和apply函数的使用
Javascript 中call函数和apply的使用: Javascript中的call函数和apply函数是对执行上下文进行切换,是将一个函数从当前执行的上下文切换到另一个对象中执行,例如: so ...
- Javascript 中的 call 和 apply
发表于 2012年02月1日 by 愚人码头 原文链接:http://www.css88.com/archives/4431 JavaScript 中通过call或者apply用来代替另一个对象调 ...
- javascript中call函数与apply
javascript中的call方法使当前对象可以调用另一个对象的方法,即改变this的指向内容 var first_object = { num: 42 }; var second_object = ...
- javascript 中caller,callee,call,apply 的概念[转载]
在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments : 该对象代表正在执行的函数和调用它的函数的参数. [function.]argument ...
- 理解和运用javascript中的call及apply
call是为了改变函数上下文context而存在的,换言之,就是改变函数内部this的指向.因为javascript存在[定义时上下文],[运行时上下文]及[上下文]是可以改变的.例如:var fun ...
- javascript 中的call和apply
一.作用及应用场景 call和apply是Function的方法,他的第一个参数是this,第二个是Function的参数.call 和 apply 都是为了改变某个函数运行时的 context 即上 ...
- JavaScript中的call()、apply()与bind():
关于call()与apply(): 在JavaScript中,每个函数都有call与apply(),这两个函数都是用来改变函数体内this的指向,并调用相关的参数. 看一个例子: 定义一个animal ...
- 理解JavaScript中的call和apply方法
call方法 总的来说call()有这几种作用:1.可以借用另一个对象的方法.2.改变this的指向(重要).3.将arguments数组化.下面详细介绍这三种作用: 1.可以借用另一个对象的方法:当 ...
- JavaScript中的call、apply、bind方法的区别
在JavaScript 中,this的指向是动态变化的,很可能在写程序的过程中,无意中破坏掉this的指向,所以我们需要一种可以把this的含义固定的技术,于是就有了call,apply 和bind这 ...
- 简单理解Javascript中的call 和 apply
javascript中面向对像的能力是后来加进来的, 为了兼容性, 所以整出了很多奇特的东西, function Animal(){ this.name = "Animal"; t ...
随机推荐
- 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)
[题目] Atlantis Problem Description There are several ancient Greek texts that contain descriptions of ...
- Java RMI远程方法调用
RMI(远程接口调用) 1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程引用层(Remote Reference Layer)和传 ...
- POJ 2075 Tangled in Cables 最小生成树
简单的最小生成树,不过中间却弄了很久,究其原因,主要是第一次做生成树,很多细节不够熟练,find()函数的循环for判断条件是 pre[i]>=0,也就是遇到pre[i]==-1时停止,i就是并 ...
- iOS开发控制器之间传值的几种小方法
在IOS开发中或面试中,经常会遇到,两个或者多个控制器之间传值的问题 ,总结的集中方法仅供参考! 问题 :将B控制器中的textField 输入内容,传到A控制器中的label上显示出来,如何传值? ...
- jquery mobile 前言
引用js: <link rel="stylesheet" href="../jquery.mobile-1.1.0/jquery.mobile-1.1.0.css& ...
- centOS 下解压 rar zip 文件
闲话不说,centos上如何安装rar.unrar在线解压缩软件呢?如果您的centos是32位的,执行如下命令: wget http://www.rarsoft.com/rar/rarlinux-3 ...
- Bootstrap+MetroNic_1.5.4 Head meta
Bootstrap+MetroNic_1.5.4 HTML <meta> 标签设定含义: <meta http-equiv="X-UA-Compatible" c ...
- Qualcomm 8X camera daemon进程浅析
Camera 先看一下抽象层的主要流程: 首先启动一个守护进程 int qcamsvr_start(void)( qcamsvr.c) { 1. server_fd = open(server_dev ...
- Java设计模式之装饰模式趣谈
本文由码农网 – 鲁阿皓原创,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 前情提要:http://blog.csdn.net/baidu_30889437/article/details/ ...
- ab apache Benchmarking中链接的写法 记得加上/
C:\wamp\bin\apache\Apache2.2.21\bin>ab.exe -n5 -c5 http://www.baidu.com ab.exe: invalid URL Usage ...