今天更新了事件监听类,没想到竟然搞出了一个奇怪的问题,着实让我想了好久也没想的太明白。。。 问题是这样的: 我有个名为createAdapter的类,它的作用是兼容IE,FRIEFOX的监听事件回调函数的参数传入,今天稍微改了下该类的代码,按逻辑来说应该事没有什么问题,但却出现的传入参数丢失的问题!
原代码:
createAdapter:function(Dt,UT)
{
return function(Q)
{
if(!Q)
{
Q=window.event;
};
if(Q&&!Q.target)
{
Q.target=Q.srcElement;
};
UT.call(Dt,Q);
};
}
新代码:
getWindowEvent : function(ca)
{
if(!ca)
{
ca=[];
};
if(!ca[0])
{
ca[0]=LLEvent.getObjWin().event;
};
if(ca[0]&&!ca[0].target&&ca[0].srcElement)
{
ca[0].target=ca[0].srcElement
};
//var la=document.getElementById('debugInfo');
//var lb=la.innerText;
//lb+=ca[0].type+':'+ca[0].srcElement+';';
//la.innerText=lb;
return ca;
},
createAdapter : function(ca,cb)
{
return function()
{
return cb.apply(ca,LLEvent.getWindowEvent(arguments));
};
},
调用测试代码:
m.onselectstart = LLEvent.testCreateAdapter(u,function(Q){alert(Q);});
使用新createAdapter代码后出现Q为undefined错误,仔细对比新旧代码,逻辑上无差别,只是在实现上原代码压入封包的参数是创建的一个局部变量,而新代码是对传入的arguments参数组加以修改实现。因此初步判断是使用arguments参数组导致的原因。于是将 getWindowEvent 与 createAdapter代码合并成一个函数,在两块代码中加入alert检测参数压入封包时是否有值,经测试发现压入封包前有值,封包函数内调用时值丢失。基本确定是因为arguments的时效性导致的问题。
确定问题所在后,就需要考虑解决方法了,最简单的就是换回原函数,使用arguments的是为了实现带参数的事件回调函数处理,所以最好是在使用arguments的情况下解决问题。于是对新createAdapter进行完全测试发现:
测试代码1:
function leiliangtest(Q)
{
alert('leiliangtest-->'+Q);
}
var la=LLEvent.testCreateAdapter(window,leiliangtest);
la('leiliang');
测试代码alert出了我传入的‘leiliang’字符串
测试代码2:
m.attachEvent('onselectstart',function(Q){alert(Q);}
测试代码alert出了我需要的window.event对象
总结上述,使用arguments做封包时要注意时效性,对传入有值的arguments,修改或直接压入封包,以普通函数方式调用不会丢失值;对不传入值,修改添加值后压入封包,以普通函数方式调用会丢失值,若以2级事件回调函数调用方式调用不会丢失值。
汗啊。。。。。。刚发现ie中使用2级事件回调函数加载方式竟然也是自动传入window.event的。。。。丢脸啊丢脸啊,更新上述总结:
对传入有值的arguments,修改或直接压入封包,调用封包函数不会丢失值;对无值的arguments,修改添加值后压入封包,调用封包函数值丢失!
- 大小: 24.4 KB
分享到:
相关推荐
本文实例讲述了Javascript中arguments用法。分享给大家供大家参考。具体分析如下: 先来看如下示例: function add(n1,n2){ return n1+n2; } function add(n1,n2,n3) { return n1+n2+n3; } alert(add(1,2)...
在这个文档中,我们将深入探讨`arguments`对象的使用方法及其特点。 首先,`arguments`对象在每个函数内部都可用,它包含了函数调用时的所有实际参数。你可以通过索引来访问这些参数,就像访问数组元素一样。例如,...
在JavaScript编程语言中,`arguments`对象是一个非常重要的特性,尤其在处理函数参数时。它不是一个数组,而是一个类数组对象,提供了访问函数调用时传递的所有参数的途径,无论这些参数是否在函数定义中声明。`...
示例代码通过两个场景展示arguments的使用方法: 第一个场景是计算5个参数1000、2000、3000、4000、5000的总和,函数display首先通过document.writeln输出参数总数,然后通过一个for循环累加参数值,并输出累加的...
### JavaScript中的`arguments`对象详解 在JavaScript编程中,`arguments`对象是一个非常有用的特性,尤其是在处理函数调用时不确定参数数量的情况下。虽然它不是ECMAScript标准的一部分,但所有主流浏览器都支持这...
在JavaScript中,arguments、caller、callee和apply是四个与函数调用相关的特性,它们在编写高级和复杂的函数逻辑时非常有用。下面将详细介绍这些概念及其用法。 1. **arguments对象** arguments对象是一个特殊...
在JavaScript中,函数的形式参数和arguments之间存在着微妙的关系。为了深入理解这方面的知识,我们需要首先了解形式参数和实际参数的概念。形式参数指的是定义方法时所明确指定的参数,而实际参数则是指javascript...
在JavaScript编程语言中,`arguments`对象是一个非常重要的特性,特别是在处理函数参数时。它不是一个真正的数组,而是一个类数组对象,提供了访问函数调用时传递的所有参数的途径。无论函数定义了多少个形式参数...
ECMAScript中的函数并不介意传递的参数有多少,也不介意是什么类型。由于JavaScript允许函数有不定数目的参数,所以我们需要一种机制,可以在 函数体内 ...这篇文章将详细介绍Javascript中的arguments对象和使用方法。
在JavaScript中,`arguments`和`this`是两个非常重要的内置对象,它们在函数的执行环境中扮演着关键角色。下面将详细阐述这两个对象的用法和特性。 首先,`arguments`对象是一个类数组对象,它提供了对函数调用时...
当然,随着JavaScript语言的发展,新的函数特性比如箭头函数等可能会影响到arguments、caller和 callee的使用方式,所以在实际编程中,开发者需要根据具体的项目需求和环境兼容性来选择合适的技术方案。
"arguments-extended"就是一个这样的开源库,专为处理JavaScript中的`arguments`对象提供了一系列实用方法,旨在增强参数操作的灵活性和便利性。 `arguments`对象在JavaScript中是一个特殊的对象,它在函数内部可用...
在文档中给出的第一个方法中,fac函数通过直接调用其自身实现递归。但一旦fac函数被重新赋值,原函数将失去引用,因此无法再次执行其递归操作,这是因为它依赖于函数名来调用自身。 在文档中给出的第二个方法里,...
下面将详细解释这三个参数的使用方法。 **arguments对象** `arguments`对象是一个非常有用的特性,它在每个函数内部都可用,用来存储函数调用时传入的所有参数。即使函数声明的参数列表没有包含所有传入的参数,`...
文章中提供了具体的例子来展示arguments对象的使用方法。例如,通过创建一个函数,它通过arguments.length来获取传入参数的个数,并打印出来。这个函数没有明确的形参定义,仅通过arguments对象来获取和处理实际传入...
本文将详细讲解这两个概念及其在复用方法中的应用。 `apply`是JavaScript中Function对象的一个方法,它可以改变函数调用的上下文(即`this`的值)并接收一个数组或者类数组对象作为参数。语法如下: ```javascript...
除了这些方法,还可以使用ES6的扩展运算符(`...`)或者`Array.from()`来转换`arguments`,但这些特性在老版本的JavaScript中可能不可用。 了解`arguments`对象的特性和如何将其转换为真正的数组对于编写灵活且可...