一.预解析:
在当前作用域下,js运行之前,会把带有var和function关键字的事先声明,并在内存中安排好。
然后再从上到下执行js语句。预解析只会发生在通过var定义的变量和function上。
var声明变量:
console.log(num); // undefined
var num=100;// 分为两部分: 声明(在运行之前就会声明) 初始化(赋值)
var 这里声明了全局变量, 并且var 声明的变量的 会预解析(在运行之前, 会直接在内存中占用位置)
console.log(num);// 100
function声明的函数:
test(); // test函数
function test(){
console.log(‘test函数’);
}
test(); // test函数
二.由此出现的问题:var 声明的变量和 function声明的函数 在预解析的区别?
得出的结论: var 声明变量时 并没有同时定义(初始化赋值)
而function 声明的函数 在预解析时 会同时定义
三.作用域链:
只有函数可以制造作用域结构,那么只要是代码,就至少有一个作用域, 即全局作用域。
凡是代码中有函数,那么这个函数就构成另一个作用域。如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域。
将这样的所有的作用域列出来,可以有一个结构: 函数内指向函数外的链式结构。就称作作用域链
注意:在JavaScript中, 作用域为可访问变量,对象,函数的集合。
四.全局变量和局部变量:
局部变量:函数体内var 声明的变量就是局部变量;
全局变量:在所有函数体外声明的变量就为全局变量;
五.JavaScript变量生命周期:
JavaScript变量生命周期在它声明时初始化。
局部变量在函数执行完毕后销毁。
全局变量在页面关闭后销毁。
六.变量的访问规则:
首先看变量在第几条链上, 在该链上看是否有变量的定义与赋值, 如果有直接使用
如果没有到上一级链上找( n - 1 级链 ), 如果有直接用, 停止继续查找.
如果还没有再次往上刚找... 直到全局链( 0 级 ), 还没有就是 is not defined
注意,同级的链不可混合查找
,
必须是局部变量:保证了数据安全,减少命名的冲突
七:闭包:
闭包是指有权限访问另一个函数作用域中的变量的函数。
JavaScript中所有的function都是一个闭包。不过一般来说,嵌套的function所产生的闭包更为强大
八:闭包的应用:
闭包可以使用在许多地方.它的最大作用有两处,一个是前面提到的可以读取函数内部的变量,
另一个就是让这些变量的值始终保持在内存中
添加括号 直接调用 上一级函数
不添加括号 需要接受 在调用