预解析
/* 把变量和函数的定义提升到所在作用域的前面
不提升赋值,不提升调用
先提升var,再提升function */
预先解析变量定义(先)和函数定义(后),也就是先提升var,再提升function,但不会提升赋值和函数调用。
<script type="text/javascript">
//案例一
var a=1;
function fun(){
alert(a); //局部变量与全局同名,会覆盖全局变量,这里相当于alert前面加一行var a;
var a=2;
}
fun(); //所以结果为undefined,预解析的原因
//案例二
// alert(num);
// var num=10;
// 等价于
// var num; //只提前定义,不提前赋值/函数
// alert(num);
// num=10;
</script>
回调函数
简单的说,就是函数作参数
函数A作为参数传递到另一个函数B中,并且在函数B中执行函数A
代码举例一:
<script type="text/javascript">
function f1(fn){
fn(); //第二步,找到f1声明,执行fn=f f2()
}
function f2(){
document.write("回调函数"); //第三步,执行f2()
}
f1(f2); //第一步,函数调用
</script>
代码举例二:(使用JS断点调试观察代码执行更加清晰)
<script type="text/javascript">
//可以自行决定函数何时可以被调用
function fun(muf){
muf("回调函数");
}
function f(a){
alert(a);
}
function f1(){
alert("bdqn");
}
fun(f);
fun(f1);
</script>
闭包
简单的说,就是函数作返回值
定义:定义在一个函数内部的函数,能够读取函数内部(局部)变量。也就是外部函数用内部函数作为返回值输出。
作用:可以读取函数内部的变量,让这些变量的值始终保持在内存中
注意:不可滥用
代码举例:
<script type="text/javascript">
function f1(){
var num=1;
function f2(){
//var num=2; //加上这一行,就不算闭包
alert(num); //闭包,num对f2相当于全局变量,对f1是局部变量(会一直保存在内存中)
}
return f2; //函数作为返回值return
}
var result=f1();
result();
// alert(f1); //直接调用f1()
// alert(f1()); //等价于f2(),但是直接调用f2(),会报错
// alert(result); //result为函数f2,结果输出f2的代码
</script>