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。

© xk_wan 2021 - 2024