<!DOCTYPE html>
<html>
<head>
</head>
<body>
<p>点击按钮就可以执行 <em>displayDate()</em> 函数。</p>
<button id="myBtn">点击这里</button>
<script>
document.getElementById("myBtn").onclick=function(){displayDate()};
function displayDate()
{
document.getElementById("demo").innerHTML=Date();
}
</script>
<p id="demo"></p>
</body>
</html>
为何在这里要用function(){displayDate()};直接用displayDate();为何不行?
因为这是声明函数
( function(){…} )()和( function (){…} () )是两种javascript立即烂李执行函数的常见写法。
函数声明、函数表达式、匿名函数
函数声明:function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明。
函数表达式 var fnName = function () {…};使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量,叫函数表达式,这是最常见的函数表达式语法形式。
匿名函数:function () {}; 使用function关键字声明一个函数,但未给函数命名,所以叫匿名函数,匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。
函数声明和函数表达式迅唤不同之处在于,
一、Javascript引擎在解析javascript代码时会‘函数声明饥昌迟提升’(Function declaration Hoisting)当前执行环境(作用域)上的函数声明,而函数表达式必须等到Javascirtp引擎执行到它所在行时,才会从上而下一行一行地解析函数表达式,
二、函数表达式后面可以加括号立即调用该函数,函数声明不可以,只能以fnName()形式调用 。
js是事件驱动的,一个节点可以发生很多种事件,包括click事件。在js中,当节点发生某戚升一个事件时,高虚老可以为该事件绑定一个处理函数。也就是类似的
document.getElementById("myBtn").onclick = function(){}
所要注意的是,这个节点的onclick属性,需要赋给一个函数类型的值,才可以处理事件。
但是displayDate()并不是一个函数,你可以说你定义了displayDate函数,但displayDate()也就是加了一对括号的displayDate,是函数执行了,displayDate()是等价于displayDate的返回值的。在displayDate函数里,只是给id为demo的节点重新设置了内容,没有返回值,所以默认的就是undefined。
那么如果写成
document.getElementById("myBtn").onclick = displayDate();
实际上是等价于
document.getElementById("myBtn").onclick = undefined;
显然undefined是不能作为节点事件的处理函数的誉游。
但是,也不是一定要加上function(){},你可以写成这样:
document.getElementById("myBtn").onclick = displayDate;
虽然displayDate()不是函数,但displayDate却是函数,是可以作为节点事件的处理函数的。
document.getElementById("myBtn").onclick=function(){displayDate()};
这句话的意思是,当你的元素触发点击事件后会触发一个函数模板比如:
function callme(){
alert("点击我了!");
}
document.getElementById("myBtn").onclick=callme;
这样野扮当事件晌脊腊被触发时,因为为事件的模板使用的是callme函数,因此它的内部功能被实现,
但是这里要注意的重点是,你的事件只能设置一个函数模板,不能传递参数,因此有了:
function(){};匿名函数,在你的匿名函数中,可以定义参数,将此参入宴滑传入到你的方法中,如:
function callme(name){
alert(name+"点击我了!");
}
document.getElementById("myBtn").onclick=function(){
var name="李四";
callme(name);
};