这是我参与第四届青训营笔记创作活动的第四天
函数的声明方式
函数有两种声明方式
第一种:命名函数
function fun(){
console.log("第一种声明函数的方式")
}
fun()
第二种:函数表达式(匿名函数) 这是匿名函数,fun是变量名,并非函数名
var fun=function(){
console.log("第二种声明函数的方式")
}
fun()//变量名加()
不同点:函数变量存的是值,函数表达式里的变量存的是函数
函数表达式也可以传递参数
作用域
概念代码名字在某个范围内起作用,目的是减少命名冲突
全局作用域
范围:整个script标签或整个js文件 全局变量:在全局作用域下的变量,全局有效
局部作用域
范围:函数内部,代码的名字只在函数内部有效 局部变量:在局部作用域下的变量,只在函数内有效 特殊情况:在函数内部没有声明直接赋值使用的变量也是全局变量
局部变量与全局变量的执行效率
- 全局变量只有在浏览器关闭时才会销毁,较为占内存资源
- 局部变量在程序执行完毕时就会销毁(建议使用)
作用域链
函数内部函数可以访问外部函数的变量
概念:内部函数访问外部函数的变量采取链式查找,称作用域链
JavaScript预解析
预解析
引入
js引擎运行js分两步:
- 预解析
- 代码执行
1.在预解析时js引擎会把JS里所有的var 和 function 提升到当前作用域最前面
2.代码执行:按照代码顺序从上至下执行
预解析分为变量预解析(变量提升),函数预解析(函数提升)
1.变量提升:只提升声明,不提示赋值
例1:
console.log(num); //undefined
var num=10
//预解析-变量提升
var num;
console.log(num);
num=10
例2:
fun(); //报错
var fun=function(){
console.log(2)
}
//预解析-变量声明提升
var fun;
fun();
var fun=function(){
console.log(2)
}
2.函数提升,预解析时,**将函数声明提前**