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是变量。所以在全局作用域,变量有赋值的话,总是在运行到它的时候赋值的,不是在全局上下文对象创建的时候赋值的。