命名函数:函数如果有名字,就是命名函数
匿名函数:函数如果没有名字,就是匿名函数
函数表达式:把一个函数给一个变量,此时形成了函数表达式
var 变量=匿名函数;
例:
var f1=function(){
}
如果是函数表达式,那么此时前面的变量中存储的就是一个函数,而这个变量就相当于一个函数,就可以直接加小括号调用。
注意:函数表达式后面,赋值结束后,要加分号。
函数可以作为参数使用,如果一个函数作为参数,那么我们说这个参数(函数)可以叫回调函数;只要是看到一个函数作为参数使用了,那就是回调函数。
function sayHi(fn){
console.log("HelloWorld");
fn();//fn此时应该是一个函数
}
function sayHello(){
console.log("你好啊")
}
函数作为返回值使用:
function f1(){
console.log("f1函数调用了");
return function(){
console.log("我是一个函数");
};
}
var ff=f1();//调用
//ff就是一个函数了
ff();
函数的作用域:
全局变量:声明的变量是使用var声明的,那么这个变量就是全局变量,全局变量可以在页面的任何位置使用
除了函数以外,其他任何位置定义的变量都是全局变量。
局部变量:在函数内部定义的变量,是局部变量,外面不能使用。
全局变量:如果页面不关闭,就不会释放,就会占空间,消耗内存
全局作用域:全局变量的使用范围
局部作用域:局部变量的使用范围
块级作用域:一对大括号就可以看成是一块,在这块区域中定义的变量,只能在这个区域中使用,但在JS中在这个块级作用域中定义的变量,外面也能使用。
说明:JS没有块级作用域,只有函数除外。
隐式全局变量:声明的变量没有var,就叫隐式全局变量
全局变量是不能被删除的,但是隐式全局变量是可以被删除的
定义变量使用var 是不会被删除的,没有var是可以删除的
预解析:提前解析代码,把变量的声明提前了,函数的声明也会被提前——都会被提前到当前所在作用域最上面。
预解析过程:
1.把变量的声明提升到当前作用域最前面,只会提升声明,不会提升赋值;
2.把函数的声明提升到当前作用域最前面,只会提升声明,不会提升调用;
3.先提升var,再提升function
var num;
console.log(num);
num=10;
函数调用的时候,会把函数的声明提升到作用域的上面
f1();//调用
var num=20;//这个变量的声明会提升到变量使用之前
function f1(){
console.log(num);
//var num=10;
}
预解析中,变量的提升,只会在当前作用域中提升,提前到当前作用域的最上面;
函数中的变量只会提前到函数作用域中的最前面,不会出去;
预解析会分段(多对的script标签中函数重名,预解析的时候不会冲突)