# 全局代码执行过程

# 变量

var name = "nekoaimer"
foo(233)
function foo(num) {
  console.log(m)
  var m = 10
  var n = 20
  console.log(name)
}

参考:

variable_scope

# 函数

var name = 'nekoaimer'
foo(233)
function foo(num) {
  console.log(m) // undefined
  var m = 10
  var n = 20
  var name = 'foo'
  console.log(name); // foo
}
//foo (2333) // 再执行会创建 FEC 执行下面操作

参考:

fn_exe_procedure

# 函数嵌套

var name = "nekoaimer"
foo(233)
function foo(num) {
  console.log(m) // undefined
  var m = 10
  var n = 20
  function bar() {
    console.log(name) // nekoaimer
  }
  bar()
}

参考:

nested_function

# 函数调用函数作用域查找

var message = "Hello Global"
function foo() {
  console.log(message)	
}
function bar() {
  var message = "Hello Bar"
  foo()
}
bar()

参考:

fn_call_Fn_exe_procedure

# 作用域面试题

  1. 作用域例题 1

    面试题
    var n = 233
    function foo() {
      n = 322
    }
    foo()
    console.log(n)

    下面正确的的输出结果是:B

    • 233
    • 322
    • undefined

    作用域
    编译代码时会创建一个 GO 对象,对象里会有一个 n,它的值是 undefined。当执行到 var n = 233 这行代码时 n 就等于 233. 接着往下执行,会发现一个函数,它也有一个对应的地址。此时 GO:{n:undefined,foo:0x0001},就会创建一个 foo 函数对象。继续执行会调用函数,执行这个函数就会创建一个 FEC,在函数调用栈里执行,执行里面的代码 n = 200,就会先去自己的 AO 里面找,但是自己的 AO 并没有这个 n,会找 parentScope,找到 GO,找到了 n 并把 n 修改为 322。执行完函数继续执行 console 时,打印出来的就是 322 了~

  2. 作用域例题 2

    面试题
    var n = 233
    function foo() {
      var n = 322
    }
    foo()
    console.log(n)

    下面正确的的输出结果是:A

    • 233
    • 322
    • undefined
  3. 作用域例题 3

    面试题
    var n = 233
    function foo() {
      let n = 322
    }
    foo()
    console.log(n)

    下面正确的的输出结果是:A

    • 233
    • 322
    • undefined
  4. 作用域例题 4

    面试题
    function foo() {
      console.log(n)
      var n = 200
      console.log(n)
    }
    var n = 100
    foo()

    下面正确的的输出结果是:B

    • 100 200
    • undefined 200
    • 200 200
  5. 作用域例题 5

    面试题
    var n = 100
    function foo1() {
      console.log(n)
    }
    function foo2() {
      var n = 200
      console.log(n)
      foo1()
    }
    foo2()
    console.log(n)

    下面正确的的输出结果是:C

    • 200 200 100
    • 100 200 100
    • 200 100 100
  6. 作用域例题 6

    面试题
    var a = 200
    function foo() {
      console.log(a)
      return
      var a = 100
    }
    foo()

    下面正确的的输出结果是:C

    • 233
    • 322
    • undefined

    作用域
    虽然 return 了,但是在编译的时候 foo 函数时会执行 FEC,将 a 放进自己的 AO 里面,值是 undefined。接着执行代码时,先打印 a,取得的值就先从自己的 AO 里面找,值是 undefined,后面执行 return 就跳出函数! 如果能看懂全局代码里面的图这个应该也很好理解!~

  7. 作用域例题 7

    面试题
    function foo() {
      console.log(a)
      var a = b = 100
    }
    foo()
    console.log(b)

    下面正确的的输出结果是:C

    • 100 100
    • undefined 100
    • undefined undefined

    作用域

Update on Views times

Give me a cup of [coffee]~( ̄▽ ̄)~*

Nico Niconi WeChat Pay

WeChat Pay

Nico Niconi Alipay

Alipay