js高级_107、上下文对象面试题

1

	console.log('global begin:'+i);
	var i=1;
	foo(1);
	function foo(i){
		if(i==4)
		return;
		
		console.log('foo() begin:'+i);
		foo(i+1);
		console.log('foo() end:'+i);
	}
	console.log('global end:'+i);	
	
	
	//i的值存在每次创建的函数上下文对象里的,所以每个函数上下文对象里的i的值不一样。
	
	//依次输出:undefindd 、1、2、3、3、2、1、1
	//整个过程产生5个上下文对象(4+1);

2

function a(){
	
}

var a;

console.log(typeof a);//结果为function,先执行变量提升再执行函数提升。

如果将a赋值为基本数据类型的值,那么结果就是基本数据类型,因为虽然是变量提升,后面函数提升后覆盖了a,将它赋值为了函数,但是有a有赋值,赋值是这两个提升后运行代码的时候才会进行的操作,所以赋值的话,他的值就又从函数变为了值。

3

if(!(b in window)){
	var b=1;
}
console.log(b);//undefind

虽然b没有用var 声明,但是这个判断是写在全局作用域里的,不是单独在方法里,而且因为变量有变量声明提前,而且这个b又是在全局的判断里的,所以在创建全局上下文对象的时候就会有这个b变量了,只是没有值,而且这个判断结果为false,也就没有赋值。如果这个判断没有在全局,而是在方法里,拿就会报错。主要是ES6之前没有块作用域也就是{},所以判断里面的var相当于也是全局的,会声明,只是赋值都看判断结果了。

4

var c=1;
function c(c){
	console.log(c);
	var c=3;
}

c(2);

会报错,因为c不是一个函数,首先变量提升,c的值是undefind,紧接着函数提升,c的值是一个函数,接着开始一行一行运行代码,开始给c赋值,c赋值为了1,所以c是变量。所以在全局作用域,变量有赋值的话,总是在运行到它的时候赋值的,不是在全局上下文对象创建的时候赋值的。

posted @ 2022-03-14 08:54  青仙  阅读(83)  评论(0编辑  收藏  举报