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,不知道和这个有没有关系。 展开
{}
这样写可以用在IE9及以上和其他浏览器
function (ev)
{var oEvent=ev||event;}
这样写可以兼容所有的浏览器
从以上两个看,本来我以为如果这样写可以用在IE8及以下,
function (ev)
{}
不过还是只能用在IE9及以上和其他浏览器里,和第一种写法没区别。
既然第二种写法兼容了两方面,那为什么第三种不能用在IE8呢?或者说既然参数写ev并不能用在IE8及更低,那为什么第二种兼容的写法就可以用在IE8及更低呢?
为什么第一种写法中,我随便写一个无意义的参数都能用?
我测试IE8是用的IETester,不知道和这个有没有关系。 展开
1个回答
展开全部
你所谓的第二种,也就是兼容写法实际上是下面这样的:
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.因为这里仍然处在全局作用域中。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询