js基础(三) 作用域
Robin 7/5/2017 javaScript面试
# 知识点一 变量
# 区分全局变量/私有变量
- 全局作用域下声明(预解释的时候)的变量是全局变量
- 在私有作用域中声明的变量和函数的形参都是私有的变量
# 知识点二 作用域
# 作用域链
在私有作用域中,我们代码执行的时候遇到一个变量,首先我们需要确定它是否为私有变量,如果是私有的变量,那么和外面的没有任何关系;如果不是私有的,则往当前作用域的上一级作用域进行查找,如果上一级作用域也没有则继续查找,一直到
window
为止(作用域链),如果window
下也没有,会有如下两种情况:- 获取值的情况
console.log(total)
:报错 - 设置值的情况
total = 100
:相当于给window增加了一个属性名total,属性值是100
- 获取值的情况
// 获取值
function fn() {
console.log(tatal) // --> Uncaught ReferenceError: num2 is not defined
taotal = 100
}
fn()
// 设置值
function fn2() {
taotal2 = 100
}
fn2()
console.log(tatal2) // --> 100
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
如何查找当前作用域的上一级作用域?
- 看当前函数是在那个作用域下定义的,那么它的上级作用域就是谁
- 和函数在哪执行的没有任何关系
var num = 12
function fn() {
var num = 120
return function() {
console.log(num) // --> 120
}
}
var f = fn()
f()
~function() {
var num = 1200
f() // --> 120
}()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
画图分析预解释的过程:
# 函数执行步骤
当函数执行的时候(直接目的:让函数体中的代码执行),首先会形成一个新的私有的作用域,然后按照如下的步骤执行:
- 如果有形参,先给形参赋值
- 进行私有作用域中的预解释
- 私有作用域中的代码从上到下执行
- ...
# 带 var
和不带 var
的关系
全局作用域中:
- 区别:带
var
的可以进行预解释,所以在赋值的前面执行不会报错;不带var
的是不能进行预解释的,在前面执行就报错 - 关系:
num2 = 12
相当于给window
增加了一个叫做num2
的属性名,属性值为12;var num = 12
相当于,首先给全局作用域增加了一个全局变量num
,但不仅如此,同时给window
增加了一个叫做num
的属性名,属性值为12。
- 区别:带
console.log(num) // --> undefined
var num = 12
console.log(num2) // --> Uncaught ReferenceError: num2 is not defined
num2 = 12
1
2
3
4
5
2
3
4
5