<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>函数表达式</title>
<script type="text/javascript">
//第一种函数定义方法(常规函数定义)
sayHello();
function sayHello(){
alert("hello");
};
/*
在初学的时候,我觉得上面的代码会报错,但是没有,后来挺纠结的,后来明白的javascript
的解释原理,就清楚了.javascript在调用一个函数的额时候,碰到sayHello()的时候,会去
寻找该函数的申明,如果在当前上下文中找到了,则回去调用申明函数的函数体,继续执行下去,
如果寻找不到,才会报错.
*/
//第二种函数定义方法(匿名函数定义)
//sayHi();//由于我使用的是PHPSTORM,这里直接显示错误
var sayHi = function(){
alert("hi");
};
/*
上述代码就出现问题了,因为不存在函数申明,所有代码执行到sayHi();的时候,
通过上下文,找不到该函数的申明,所以会报错
*/
sayHi();
/*
这样,程序就能执行下去了,因为在执行到sayHi();的时候,javascript解释器
会在后台帮我们把上面的匿名函数转换成一个常规函数,这样就正常执行了.
*/
/*
下面说说匿名函数和闭包,也许很多开发者没有注意这样的问题,因为毕竟他们
做前端久了,没有学习过java,所谓的匿名函数,就是隐藏掉函数名而直接使用
或定义的函数,而闭包,就是在函数内部还定义了另外一个函数,内部函数可以访问
外部函数的数据,但是外部函数却不能访问内部函数的数据,这个跟java中的内部类
类似.
如在java中我们可以这些一个类
public class Outer{
String name;
public class Inner{
int age;
}
}
这样的话,内部类就可以访问外部类属性name,但是外部类却不能访问内部类的age属性
同理,闭包也是如此,如:
*/
function outer(num){
return function(param1,param2){
//在内部函数里可以访问外部数据
var value = num;
var value1 = param1;
var value2 = param2;
if(value==value1){
return 0;
}else if(value==value2){
return 1;
}else{
return -1;
}
};
}
/*
上述代码就是由两个函数嵌套使用的,因此,这样的结构叫闭包.
*/
</script>
</head>
<body>
</body>
</html>