# 全局代码执行过程
# 变量
var name = "nekoaimer" | |
foo(233) | |
function foo(num) { | |
console.log(m) | |
var m = 10 | |
var n = 20 | |
console.log(name) | |
} |
参考:
# 函数
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 执行下面操作 |
参考:
# 函数嵌套
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() | |
} |
参考:
# 函数调用函数作用域查找
var message = "Hello Global" | |
function foo() { | |
console.log(message) | |
} | |
function bar() { | |
var message = "Hello Bar" | |
foo() | |
} | |
bar() |
参考:
# 作用域面试题
-
作用域例题 1
面试题 var n = 233
function foo() {
n = 322
}
foo()
console.log(n)
下面正确的的输出结果是:B
作用域
编译代码时会创建一个 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
面试题 var n = 233
function foo() {
var n = 322
}
foo()
console.log(n)
下面正确的的输出结果是:A
-
作用域例题 3
面试题 var n = 233
function foo() {
let n = 322
}
foo()
console.log(n)
下面正确的的输出结果是:A
-
作用域例题 4
面试题 function foo() {
console.log(n)
var n = 200
console.log(n)
}
var n = 100
foo()
下面正确的的输出结果是:B
-
作用域例题 5
面试题 var n = 100
function foo1() {
console.log(n)
}
function foo2() {
var n = 200
console.log(n)
foo1()
}
foo2()
console.log(n)
下面正确的的输出结果是:C
-
作用域例题 6
面试题 var a = 200
function foo() {
console.log(a)
return
var a = 100
}
foo()
下面正确的的输出结果是:C
作用域
虽然 return 了,但是在编译的时候 foo 函数时会执行 FEC,将 a 放进自己的 AO 里面,值是 undefined。接着执行代码时,先打印 a,取得的值就先从自己的 AO 里面找,值是 undefined,后面执行 return 就跳出函数! 如果能看懂全局代码里面的图这个应该也很好理解!~ -
作用域例题 7
面试题 function foo() {
console.log(a)
var a = b = 100
}
foo()
console.log(b)
下面正确的的输出结果是:C
作用域
~