代码1
<!DOCTYPE HTML>
<html>
<body>
<link type="text/css" rel="stylesheet" href="example.css">
<div class="d1">1
<div class="d2">2
<div class="d3">3
</div>
</div>
</div>
<script>
var divs = document.getElementsByTagName('div')
for(var i=0; i<divs.length; i++) {
divs[i].onclick = function(e) {
e = e || event
var target = e.target || e.srcElement
this.style.backgroundColor='yellow'
alert("target = "+target.className+", this="+this.className)
this.style.backgroundColor = ''
}
}
</script>
</body>
</html>
代码2
<html>
<body onkeypress = "show_key(event.which)">
<form method="post" name="my_form">
The key you pressed was:
<input type="text" name="key_display" size="2"/>
</form>
<script type="text/javascript">
function show_key ( the_key )
{console.log(the_key);
document.my_form.key_display.value = String.fromCharCode ( the_key );
}
</script>
</body>
</html>
问题:
1.在代码1中,即使我将function(e) {e = e || event
更改为function(a) { e = a || event
,它仍然有用,但在代码2中,如果我将show_key(event.which)
更改为show_key(e.which)
,则会不行,为什么?
2.我经常在js中看到function(e){}
或function(event)
,它们是否相同?我可以这样使用:function(a){}
还是function(b){}
?
答案 0 :(得分:3)
标识符event
在JavaScript中并不特殊,您可以在函数参数中使用e
,a
或b
等替换它,而不会更改其含义。< / p>
但是,重命名变量(无论是否为event
)在函数外部会产生一些影响:新名称可能会影响外部作用域中同名变量(即函数周围的代码) ,内部功能也必须改变。
在 Codes 2 中的<body onkeypress="show_key(event.which)">
中,浏览器在运行 onkeypress 事件处理程序之前创建名为event
的本地变量。这就像创建function(event) { show_key(event.which); }
然后每按一次键调用该函数一样。函数参数的名称始终为event
,您无法更改它,因此从这个意义上讲它是特殊的。
答案 1 :(得分:0)
这是一个函数声明:
function xy(a) {
return a + 1;
}
您可以将其翻译为:;
function xy() {
var a = arguments[0];
return a + 1;
}
虽然arguments
是您在调用函数时提供的参数数组:
xy(1, 2); // --> arguments = [1, 2]
您可以根据需要命名a
,因为它只是一个变量声明。这就是为什么以下代码同样有效:
function xy(b) {
return b + 1;
}
当你像这样调用函数xy
时:
xy(a);
这意味着您将变量xy
的值传递给a
。这就是为什么必须有一个在函数调用之前声明的变量a
:
var a = 4;
xy(a);
如果您在函数调用a
中更改b
,则会失败,因为b
未定义:
var a = 4;
xy(b); //where is b???
这就是为什么你可以改变这个
function(e) {e = e || event}
到此:
function(a) {e = a || event}
但是如果你试图改变它(这是一个函数调用):
show_key(event.which)
到此:
show_key(e)
它希望e
是一个已经声明的变量,它不是。但是,event
是window
对象的属性(至少在Internet Explorer中),这意味着它可以从任何地方访问。