欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ES6函数细节干货(包括arguments,new.target,箭头函数)

程序员文章站 2023-12-22 08:32:22
...
前言

在正式接触ES6函数之前,相比大家对ES3.1中的函数都有所了解,那么从下面博客ES6的知识干货中跟ES3.1做对比,这样才能更好的理解。

函数

ES6函数新增特性
1.ES6参数可以加默认值(new)
eg:通过传默认值就可以达到想要的效果

function fun(a,b=10,c=20){
	return a+b+c;
		console.log( fun(undefined,undefined,30) );//60
		console.log( fun(1,2,3) )//6
		console.log( fun(30) )//60,将默认值写在后面,可以直接传一个数
		console.log( fun(10,undefined,30) )//50
		console.log( fun(10,null,30) )   //40,null在数学中,默认的为0,不要传递null
}

2.ES6可以传递表达式(new)但× 不能传递语句 ×
eg
ES3.1创建一个元素 插入到某个元素中

		//ES3.1创建一个元素  插入到某个元素中 
		// name 创建的标签   大多数为div
		// container  需要往哪个元素中插入   大多数为container
		// content   内容

		function createElement(name,container,content){
			const ele = document.createElement(name);
			if(content){
				ele.innerHTML = content
			}
			container.appendChild(ele)
		}
	createElement("div",document.getElementById("container"),"sdfsdfsd")
	//成功,在页面中插入div内容为sdfsdfs	

ES6创建一个元素 插入到某个元素中

//ES6创建一个元素  插入到某个元素中
							   				//ES6可以在参数中传递表达式
		function createElement(name = "div",container = document.getElementById("container"),content){
			const ele = document.createElement(name);
			if(content){
				ele.innerHTML = content
			}
			container.appendChild(ele)
		} 
	createElement(undefined,undefined,"sdfsdfsd")//成功,在页面中插入div内容为sdfsdfsd

//通过例子的对比我门发现在ES6中只需传递表达式就可完成代码代码效果,减少ES3.1中操作,提升效率

函数>arguments

arguments在严格模式中arguments和函数的形参不存在关系,没有对应的映射关系
! 只要给函数加上了参数默认值,该函数会自动变成严格模式 !
!形参和let,const一样,有自己的作用域,根据声明的顺序会产生生临时性死区 !

//已自动开启严格模式
function test(a,b=10){
			console.log("arguments",arguments[0],arguments[1])//arguments 1 2
			console.log('a',a,"b",b)//a 1 b 2
			a = 5;
			console.log("arguments",arguments[0],arguments[1])//arguments 1 2
			console.log('a',a,"b",b)//a 5 b 2
		}
		test(1,2)					   
函数>new.target(new)
	//ES6以前
	function Person(firstName,lastName){
	if(!(this instanceof Person)){
		throw new Error("该函数必须使用new调用")//这样就可以在直接调用下提示错误
												//但这样是无法完全避免的
	}
		this.firstName = firstName;
		this.lastName = lastName;
		this.fullName = `${firstName} ${lastName}`
	}
//面试点:new调用和直接调用结果
//new调用
const p1 = new Person("张","三")
console.log(p1)//成功调用
//直接调用
const p2 =  Person("张","三")
console.log(p2)//失败undefined
//通过call改变指向依然会undefined
const p3 = Person.call(p1,"张","三")
console.log(p3)

//ES6
//使用new.target就可以真正避免此问题
if(new.target === undefined){//如果没有使用new 关键字调用函数,则返回undefined
	throw new Error("该函数必须使用new调用")//如果使用了new调用,则返回的是函数的本身
}

函数>箭头函数

箭头函数是一个函数表达式,理论上任何使用函数表达式的地方都可以改成箭头函数
(参数1,参数2…)=>{函数体}

this指向问题
1.对象调用函数,this指向对象
2.直接调用函数,this指向window
3.如果使用了new关键字,this指向新创建的对象
4.如果使用apply,call,bind this指向绑定的数据
5.如果是DOM事件函数,this指向事件源

箭头函数语法
// 箭头函数的写法
		// 简写
		// 1.如果参数只有一个,可以省略小括号
		// 参数 => {}
		const print = num => {
			console.log(num)
		}
		print(1000)
		// 2.如果箭头函数只有一条返回语句,可以省略花括号,可以省略return
		// 参数 => 返回值
		const isOdd = function(num){
			return num % 2 !== 0;
		}
		const isOdd = num => {
			return num % 2 !== 0;
		}
		const isOdd = num => num % 2 !== 0;
		console.log(isOdd(3))
		console.log(isOdd(4))
		// 2.1 如果返回值是一个对象的时候
		const obj = (a,b) => 
			({//只有花括号就会认为成函数体就会报错//把返回值变成表达式的形式就ok
				a : a,
				b : b
			})
		console.log( obj(1,2) )
		//面试点
		// 1.箭头函数中没有this,argument,new.target,如果要强行使用,则指向函数外层对应的this,argument,new.target
		// 2.箭头函数没有原型,所有说占用空间非常小,不能当成构造函数来使用
		console.log(func,func.prototype)   
		console.dir(func)
		// 应用场景
		// 1.临时使用的函数,并不会刻意的去调用
			// 1.异步的处理函数
			// 2.事件的处理
		// 2.继续去沿用外层的this
		// 3.对象的属性不要去用箭头函数,除非是特别的需求
		// 4.数组方法的时候,保证代码的简洁
		const arr = [1,2,89,45,123,54];
		const result = arr.map(num => num*2);
		console.log(result)

相关标签: es6

上一篇:

下一篇: