javascript事件处理函数的参数的问题

function(event){}这样写可以用在IE9及以上和其他浏览器function(ev){varoEvent=ev||event;}这样写可以兼容所有的浏览器从以... function (event)
{}
这样写可以用在IE9及以上和其他浏览器

function (ev)
{var oEvent=ev||event;}
这样写可以兼容所有的浏览器

从以上两个看,本来我以为如果这样写可以用在IE8及以下,
function (ev)
{}
不过还是只能用在IE9及以上和其他浏览器里,和第一种写法没区别。

既然第二种写法兼容了两方面,那为什么第三种不能用在IE8呢?或者说既然参数写ev并不能用在IE8及更低,那为什么第二种兼容的写法就可以用在IE8及更低呢?
为什么第一种写法中,我随便写一个无意义的参数都能用?

我测试IE8是用的IETester,不知道和这个有没有关系。
展开
 我来答
cainiaokan
2015-01-30 · TA获得超过2917个赞
知道小有建树答主
回答量:651
采纳率:66%
帮助的人:600万
展开全部

你所谓的第二种,也就是兼容写法实际上是下面这样的:

function(event){
event = event? event: window.event;
//或者像下面的是等价的
event = event || window.event;
}

老版本IE,事件对象放到了全局命名空间下。也就是window属性上。而标准浏览器的事件对象是注入的。也就是方法的参数event。参数是注入的,所以参数名你可以随便起。上面叫做event。你也可以叫做ev,也可以叫做ev123.只要符合变量名的规范就可以了。


因此,你要明白,老版本IE的事件模式跟标准事件之间的区别是什么。跟变量名本身是没有关系的。而是跟事件对象的来源有关。


再重申一下。旧版IE浏览器的事件对象注册到了window对象中。标准事件模型中,事件对象是注入到了事件方法的参数中。

追问
那我写的第二种写法,没有用到window,为什么IE8也可以用呢?
追答

这是跟js作用域的关系。因为window.event是全局的作用域。所以你在哪都可以引用到。但是前提是,你当前的作用域下没有一个同名的变量。比如下面:

var a = 123;//跟window.a = 123;是等价的。注册到window属性上的变量会自动作为全局作用域变量

function foo(){
    var a = 456;
    alert(a);
}

foo();//这里会弹出456,因为foo中的a作用域覆盖了外层全局作用域中的同名变量a
alert(a);//这里弹出123.因为这里仍然处在全局作用域中。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式