记录一些有意思的前端面试题

1、乘积函数
在这里插入图片描述
代码

	function mul(){
		let {slice}=Array.prototype;
		let argus=slice.call(arguments,0);

		let returnFn=function(){
			let arguArr=slice.call(arguments,0);
			return mul.apply(null,arguArr.concat(argus))
		}

		returnFn.valueOf=function(){
			return argus.reduce(function(total,item){
				return total*item
			})
		}
		returnFn.toString=null
		return returnFn
	}
	alert(mul(3)(3,3)(4))
	alert(mul(3,10,3))

2、一个表达式的结果

const result=++[[]][+[]]+[+[]];
console.log(result)//?

答案:‘10’
+[ ] => 0
[+[ ]] => [0]
[[]][0] => []
++[] => 1
1+[0] => ‘10’

3、函数声明和函数表达式

var foo = 1;

(function foo(){
    foo = 100;
    console.log(foo);
}())

console.log(foo);

答案:
在这里插入图片描述
解析:

	var foo = 1;// 全局声明变量foo为1

	// 创建IIFE立即执行函数表达式(创建一块的私有作用域空间)
	(function foo(){  // 函数声明foo(局部声明),该名称可以在函数体内部被引用
	    foo = 100;  // 对声明的函数名称不能重新赋值,严格模式下报错,非严格模式下不生效不报错
	    console.log(foo);  // 因此在这里输出函数的定义
	}())
	
	console.log(foo);// 输出全局变量1

其中定义的函数foo外部的()的作用:js会对()内部的内容作为一个表达式立即执行。等价于:

+function(){}
~function(){}
-function(){}
!function(){}
(function foo(){})()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值