函数和变量的有效范围就是作用域
1、作用域的概念vara=10;functionf1(){console.log(a);}f1();//变量a在函数外定义,可以在函数内使用functionf2(){varb=20;}console.log(b);//变量b在函数内定义,在函数外无法访问,报错:bisnotdefined
这是因为js中存在作用域的概念。
作用域:
作用域就是指定一个变量或者一个函数的作用范围。
能在页面的任何位置都可以访问,称为全局作用域
只能在局部(函数内)访问,称为为局部作用域
在全局作用域下声明的变量,称为全局变量
在局部作用域下声明的变量,称为局部变量
上述代码中,a是全局变量,b是局部变量
ES5中只有函数才有作用域,所谓是局部作用域也可以叫函数作用域。
作用域的作用就是为了把数据进行保护,不让外部的数据对我们的数据进行污染
2、函数和变量声明的提升在JS中存在一个很重要的特性,函数和变量声明的提升。怎么理解声明提升呢?我们先来看一道面试题:
以下①②③④打印什么?
console.log(a);//①vara=;console.log(a);//②console.log(f);//③f();//④functionf(){console.log("函数声明提升");}
①处的代码如果按照我们以前的理解,代码从上而下执行,那么在执行这行代码的时候,a还没有被声明,所以直接访问一个没有被声明的变量,程序应该报错。
但是结果却大出所料,这里得到的结果是undefined。
③处的结果也和我们最初的认识是不一样的,结果为f对应的函数对象。
造成这个结果是因为变量和函数的作用域提升的原因,什么意思呢?
JS是解释性语言,JS引擎对代码的处理分为两步:
预解析处理:在代码执行之前,对代码做全局扫描,对代码中出现的变量和函数提前声明处理;
//上面代码预解析后会变成这样:vara;//变量提前声明,但不初始化//函数提前声明functionf(){console.log("函数声明提升");}console.log(a);//undefineda=;console.log(a);//console.log(f);//函数对象f();//函数声明提升
调用执行:然后自上而下的执行代码
今天是日更公号的第/天此时此刻是年5月1日;23:35分加油ヾ(?°?°?)??
都看到这里了,你不