所在的位置: js >> js介绍 >> Js入门十三作用域上

Js入门十三作用域上

函数和变量的有效范围就是作用域

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分

加油ヾ(?°?°?)??

都看到这里了,你不


转载请注明:http://www.aierlanlan.com/rzfs/252.html