【面试题集—No.10】 闭包面试题

本文通过一系列闭包面试题,帮助读者检验和巩固JavaScript闭包的理解。内容涵盖闭包的基本概念,以及与this、执行上下文和作用域的关系。通过解答题目,提升对闭包的实际运用能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

👸🏾:写在前面:在学习了闭包之后,试着做做这些题。其实是一种很棒地检验自己学习成果的手段。我当时反反复复,学了但好像又没完全学,遇到题还是一头雾水,到现在可以捋得很清楚也经历了蛮久的。而且从this,执行上下文,作用域一直走过来,这些题目涉及的内容也相对全面,加油喽。👍🏾 

​​​​​​​👉【JS基础整理—No.06】闭包_Chailo的博客-优快云博客

//🍕 闭包面试题1
function show(){
	f = function fn(){
		console.log(x);
	}
	var x=20;
	f();
}
show();	//20

//🍕 闭包面试题2
var name='window'
var object={
    name:'object',
    getName:function(){
        return function(){
            return this.name
        }
    }
}
console.log(object.getName()());	//window
// fn1=object.getName();	即fn1=getName()的返回值
// fn1=function(){return this.name}
// 输出 fn1()				相当于 函数自调用

//🍕 闭包面试题3
var name='window'
var object={
    name:'object'
    getName:function(){
        var that=this				//关键点
        return function(){
            return that.name
        }
    }
}
console.log(object.getName(()));	//object

//🍕 闭包面试题4
functiom fun(){
    return console.log(1);		//console.log(1)也是一个函数
}
console.log(fun());				//1 undefined

最后这俩题当时绕了我好一阵

//🍕 闭包面试题终极一
function fun(n ,o){
    console.log(o)
    return{
        fun:function(m){
        	return fun(m,n)
    	}
    }
}
var a= fun(0)	//打印o Undefined 给a返回一个对象 里面有闭包{n:0}
a.fun(1)		//打印o 0  调用a的属性fun m=1,去上层作用域找到 n=0 fun(1,0) 打印o 0 
a.fun(2)		//打印o 0  调用a的属性fun m=2,去上层作用域找到 n=0 fun(2,0) 打印o 0
a.fun(3)		//打印o 0  调用a的属性fun m=3,去上层作用域找到 n=0 fun(3,0) 打印o 0
//Undefined 0 0 0
//----------
var b=fun(0).fun(1).fun(2).fun(3)	//	Undefined 0 1 2
//打印o 0  调用a的属性fun m=1,去上层作用域找到 n=0 fun(1,0) 打印o 0 此时 n=m=1
//fun(0).fun(1). fun(2) n=1 fun(2,1) 打印o 1
//...
//----------
var c=fun(0).fun(1)		//Undefined 0
c.fun(2)		//1
c.fun(3)		//1 
//🍕 闭包面试题终极
function Foo(){
    getName=function(){alert(1);}
    return this
}
Foo.getName=function(){alert(2);}
Foo.prototype.getName=function(){alert(3);}
var getName=function(){alert(4);}
function getName(){alert(5);}
//请写出输出结果
Foo.getName();		//2
getName();			//4		出现同名的变量和函数,预解析完getName指向函数;代码执行过程中给变量赋值
Foo().getName();	//1		
//对象.getName() Foo()自调用,返回对象this,this-->window 即window.getName();但是函数调用会把全局的getName()覆盖掉 
getName();			//1		全局getName被覆盖
new Foo.getName();	//2		new关键字的作用:执行函数;找最近的()
new Foo().getName();//3		var f=new Foo(); f.getName(); Foo的实例f,f现在自身找,找不到去原型找。
new new Foo().getName();//3	var f=new Foo(); new f.getName(); new function(){alert(3);}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值