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是变量。所以在全局作用域,变量有赋值的话,总是在运行到它的时候赋值的,不是在全局上下文对象创建的时候赋值的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构