JS作用域面试题
date
Dec 1, 2022
slug
js-scope-interview
status
Published
tags
Interview
summary
js-scope-interview
type
Post
输出打印什么?
面试题一:
var n = 100
function foo(){
n = 200
}
foo()
console.log(n) 答案:
输出打印结果为200.
理由: 这里foo函数内并不是声明新的AO变量,而是赋值全局变量N,因此执行完foo 之后,n已经被修改为200,则打印结果为200。
面试题二:
function foo(){
console.log(n)
var n = 200;
console.log(n)
}
var n = 100;
foo()答案:
输出打印结果为 undefined, 200
理由:代码编译阶段函数内是声明了新的AO变量n, 初始值为undefined,在执行阶段先打印undefined,然后赋值200,则继续打印出200。
面试题三:
var n = 100
function foo1(){
console.log(n)
}
function foo2(){
var n = 200
console.log(n)
foo1()
}
foo2()
console.log(n)答案:
输出打印结果: 200, 100, 100
理由: foo1 在编译阶段AO中没有n,父级作用域是全局对象GO,foo2在编译阶段声明了函数AO变量n,代码执行foo2时先给AO对象中n赋值为200,则第一个打印值为200, 然后执行foo1, 打印的是foo1 父级作用域中GO的n值,则打印100, 最后打印n也是GO中的变量,则为100。
面试题四:
var a = 100
function foo(){
console.log(a)
return
var a = 200
}
foo();答案:
输出打印结果:undefined
理由:代码编译阶段,foo函数内声明了AO变量n, 初始化值为undefined,代码执行阶段由于函数return,赋值操作没有执行,打印结果还是undefined。
面试题五:
function foo(){
var a = b = 100
}
foo()
console.log(a)
console.log(b)答案:
输出结果: a is not defined, 100
理由: var a = b = 100 相当于 var a =100; b = 100, 因此在代码编译阶段,a 是函数foo内AO对象新声明的变量,b相当于全局GO变量,在函数外打印a, 则会去全局查找a变量,输出 a is not defined,打印b 则输出100。