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 ...
随机推荐
- linux上怎么切换不同版本的arm-linux-gcc?只需改一行函数
linux上怎么切换不同版本的arm-linux-gcc?只需改一行函数 ln -s /usr/local/arm/3.4.1/bin/arm-linux-gcc /usr/bin/arm-linux ...
- JavaScript元素的创建、添加、删除
<script> var x=document.getElementById("p2"); var obj=document.createElement("p ...
- bzoj2257
不难发现其实这个捣鼓过程就是一个辗转相减所以最小燃料是瓶容量的最小公约数然后穷举约数即可 ..] of longint; n,k,x,i,m,j,t:longint; procedure sort(l ...
- (转载)Linux上iptables防火墙的基本应用教程
(转载)http://www.vpser.net/security/linux-iptables.html iptables是Linux上常用的防火墙软件,下面vps侦探给大家说一下iptables的 ...
- LoadRunner_Analysis(z) 分析
LoadRunner_Analysis(z) 分析 lr_Analysis(z) Analysis Summary Page Analysis Summary(分析总结页面) 分为三个部分: Stat ...
- IO流的应用————小型资源管理器
小型资源管理器 private void LoadTreeView() { DirectoryInfo dir = new DirectoryInfo(@"E:\"); Direc ...
- [GRYZ2014]最大连续子序列的和
求给定序列的最大连续子序列和. 输入:第一行:n(n<100000) 第二行:n个整数[-3000,3000]. 输出:最大连续子序列的和. 样例: 输入: 7 -6 4 ...
- NodeJS with Express 4.x
Express 4.x 静态资源目录设置: //静态文件目录 app.use('/public', express.static(__dirname+'/public')); app.use('/da ...
- poj 1039 Pipe(几何基础)
Pipe Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9932 Accepted: 3045 Description ...
- CMDB处理数据流程
客户端代码执行流程: 服务器端接收并处理数据流程: