js基础(三) 作用域

7/5/2017 javaScript面试

# 知识点一 变量

# 区分全局变量/私有变量

  1. 全局作用域下声明(预解释的时候)的变量是全局变量
  2. 在私有作用域中声明的变量和函数的形参都是私有的变量

# 知识点二 作用域

# 作用域链

  1. 在私有作用域中,我们代码执行的时候遇到一个变量,首先我们需要确定它是否为私有变量,如果是私有的变量,那么和外面的没有任何关系;如果不是私有的,则往当前作用域的上一级作用域进行查找,如果上一级作用域也没有则继续查找,一直到 window 为止(作用域链),如果 window 下也没有,会有如下两种情况:

    1. 获取值的情况 console.log(total):报错
    2. 设置值的情况 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
  1. 如何查找当前作用域的上一级作用域?

    1. 看当前函数是在那个作用域下定义的,那么它的上级作用域就是谁
    2. 和函数在哪执行的没有任何关系
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

画图分析预解释的过程:

image.png

# 函数执行步骤

  1. 当函数执行的时候(直接目的:让函数体中的代码执行),首先会形成一个新的私有的作用域,然后按照如下的步骤执行:

    1. 如果有形参,先给形参赋值
    2. 进行私有作用域中的预解释
    3. 私有作用域中的代码从上到下执行
    4. ...

#var 和不带 var 的关系

  1. 全局作用域中:

    1. 区别:带 var 的可以进行预解释,所以在赋值的前面执行不会报错;不带 var 的是不能进行预解释的,在前面执行就报错
    2. 关系: 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

# 参考

你不知道的执行上下文 (opens new window)