现阶段初步接触了js,其中非常非常重要的就是它的作用域问题了,下面我会介绍怎么去分析js代码。
js代码的执行过程我们要知道,它分为两个步骤:
一、预解析,它又划分为两种:
变量预解析(变量提升) :指的是把所有变量声明提升到当前作用域的最前面,
这里不提升赋值操作
函数与解析(函数提升):指的是把所有函数声明提升到当前作用域的最前面,
这里不提升赋值操作
这里的概念不清楚不重要,下面有实际代码例子更好的帮助理解。
二、代码执行
拿到一个js代码,首先我们就得做预解析,以致于帮助我们自己写js,我开始从基础代码分析:
以下面代码为例:
<script>
console.log(num);
var num = 3;
</script>
这是一个非常基础的代码,我们得知道js实际执行过程:
var num;
console.log(num);
num = 3;
代码从上至下执行,由于num输出时没有初始值,结果为undefined
。
再来一个例子
<script>
var num = 10;
f1();
function f1() {
console.log(num);
var num = 20;
}
</script>
再来分析代码,还是预解析:
var num;
function f1() {
var num;
console.log(num);
num = 20;
}
num = 10;
f1();
结果从上得知,就近原则取变量值;结果也会是undefined
了。
这里的就近原则是指js的作用域链是从输出语句一层一层网上查找变量值,直到找到为止,例如:
<script>
var num = 20;
f1();
function f1() {
var num = 10;
f2();
function f2() {
console.log(num);
}
}
</script>
根据变量挨得最近的var num = 10;
从而就输出它的值10了,而不是最远的20。
这里就可以知道:我们原先赋值语句的位置并没有发生改变,只是把变量声明和函数声明提到最前面去了,这也可以很好的去理解预解析啦!
这里顺便说一下块级作用域:
上代码跟好理解
来一个简单的代码:
<script>
function f() {
var num = 10;
console.log(num);
}
f();
console.log(num);
</script>
这个js代码的运行结果:
因为我们在全局作用域下无法去访问块级作用域中的代码变量值,故就会报错了,但在块级作用域下却可以访问全局变量哦!
再上一个代码:
<script>
f1();
console.log(b);
console.log(c);
console.log(a);
function f1() {
var a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}
</script>
这个js代码的运行结果:
根据块级作用域,不难得出,在程序的中间var a = b = c = 9;
指的实际上为:
var a = 9;
b = 9;
c = 9;
a为局部变量,b和c都为全局变量,当在全局域中去访问局部变量的a值,自然就会报错了。
至此,这篇文章就结束了,刚刚接触js,其中还有语言术语的不严谨,望各位大佬指点错误。。。