JS函数作用域的问题
作用域:
js中所有的变量,都有自己的作用域。当我们要访问变量时,必须要在规定的作用域下才能访问的到。首先作用域这个名词,它针对的是变量,产生于函数的层级关系。也就是说,因为函数的嵌套使用,在不同函数层级中声明的变量,才出现了不同的作用域。
函数作用域:使用范围
-
全局变量:声明的变量是使用var声明的,那么这个变量就是全局变量,全局变量可以在页面的任何位置使用,除了函数以外,其他的任何位置定义的变量都是全局变量
-
局部变量:在函数内部定义的变量,是局部变量,外面不能使用
-
全局变量,如果页面不关闭,那么就不会释放,就会占空间,消耗内存
-
全局作用域:全局变量的使用范围
-
局部作用域:局部变量的使用范围
-
块级作用域:一对大括号就可以看成是一块,在这块区域中定义的变量,只能在这个区域中使用,但是在js中在这个块级作用域中定义的变量,外面也能使用;
注意:ECMAScript 6中新引入了 let 关键字,用于指定变量属于块级作用域
-
隐式全局变量:声明的变量没有var,就叫隐式全局变量
function fun(){
if(true){
var a=11
}
console.log(a); //11
}
fun();
function fun(){
if(true){
let a=11
}
console.log(a); //ReferenceError: a is not defined
}
fun();
块级作用域可通过新增命令 let 和 const 声明,所声明的变量在指定块的作用域外无法被访问,let 声明的语法与 var 的语法一致。你基本上可以用 let 来代替 var 进行变量声明,但会将变量的作用域限制在当前代码块中。
var num = 10;
function f1() {
var num = 20;
function f2() {
var num = 30;
function f3() {
var num = 50;
console.log(num); //50
}
f3();
}
f2();
}
f1();
var a = 1;
function fun() {
console.log(a);
var a = 5;
}
fun()
上面例子中a的值为undefined,因为a变量在函数体内部再次声明,所以变量提升了
JavaScript的函数作用域是指在在函数内声明的所有变量在函数体内始终是可见的,也就是说在函数体内变量声明之前就已经可用了。
作为属性的变量
当声明一个全局变量的时候,实际上是定义了全局对象window的一个属性。
var num = 1; //声明全变量num
console.log(window.num) //输出:1 声明的全局变量实际上就是声明了一个window对象的属性