作用域
-
变量和函数的生效范围
1.根据作用域,可以把变量和函数分为 全局变量 和 局部变量.
2.JS中的作用域是 函数级作用域 ,而c语言中的作用域是块级作用域.
3.全局变量 和 全局函数(只要不在函数中声明的变量和函数,都是全局变量和函数.)
对于全局变量和全局函数,作用域整个script标签,生命周期跟整个页面一样.
对于局部变量和局部函数(在一个函数内部声明的),作用域就是当前函数的函数体
4.JS内存管理: 都是垃圾回收机制,系统自动管理,当变量或者函数,超出作用域,该变量和函数的内存空间,就会被垃圾回收机制回收,程序员不需要自己手动管理.
-
特性
-
JS中,不能在外边直接访问函数中的局部变量和函数,但是在函数中,可以访问外边的全局变量和全局函数,外面看不见里面,里面看见外边.
-
在函数中声明变量时,不加var,相于对window的全局属性赋值,是全局变量.(一定要结合第3点),保证该函数作用域中,没有与之同名的局部变量.
-
就近原则,访问变量时,会先在当前作用域中查看有没有该变量名或者函数名,如果有优先使用该作用域中的的变量名,如果没有继续往上查看父级作用域,依次找到全局作用域,如果还没有,系统报错
-
函数的作用域在定义时,就已经形成了,跟调用位置无关.
-
在下面script标签中,可以访问上面script标签中的全局变量和全局函数(上面的不能访问下面的)
-
var a= 0;
if(true){
console.log(a); // function a(){} 因为块中函数声明提升
a = 1; // 块作用域中 a = 1; windows.a = 0;
// 函数声明提升;
// 特殊处理了,为了兼容ES3语法规范,会把当前的对a操作映射到全局作用域中(a = 1),但是这个代码之后,操作就和全局没有任何关系了。
function a(){}; // a = 1; windwos.a = 1;
console.log(a); // 1
a = 21; // a = 21;
console.log(a); // 21
}
console.log(a); // 1