JS 基础 03:函数的高级特性

151 阅读1分钟

1.函数类型提升

无论函数定义在哪里,都最先被解析。所以函数定义的位置不影响函数调用

2.函数表达式

将匿名函数赋给变量,变量名就是函数名。
但没有函数提升的特性,即只能在定义之后的语句被调用
    fun(1,2)    //报错 Cannot access 'fun' before initialization
    const fun = function(m,n){
	return m+n;
    }
    fun(10,23)

3.函数的默认形参

	function sum(a=100,b=10){
		return a+b;
	}
	console.log(sum());
	console.log(sum(10,30));

4.闭包函数

一般来说,外部无法访问到内部作用域定义的变量。为了绕过这种限制,在函数内部返回另一个函数(闭包函数)。

    function fun1(){
  	let local_A="局部变量 1"
  	let local_B="局部变量 2"
  	return function fun2(){
  		console.log(local_A,local_B);
  	}
  }
  const p = fun1();	//	返回函数fun2()
  p()			//	局部变量 1 局部变量 2

内部的闭包函数若未被执行完,主调函数即使执行完也不会被销毁,主调函数的内部内容也将保留一阵子。

5.箭头函数

使用箭头函数不仅仅为了简单,而是为了箭头函数的this属性
普通函数的this,主体是调用this的函数
箭头函数的this,主体是this所处的位置

const cat = {
	name:"miaomiao",
	sayName(){
		setInterval(function(){
			console.log(this.name);
		},1000)
	}
}
cat.sayName()	//开始每隔一秒执行一次打印,但什么都没输出。
                //因为setInterval()是window对象的方法,
		//此时this的主体是window对象。window没有name这个属性
							
const dog = {
	name:"wangwang",
	sayName(){
		setInterval(()=>{
			console.log(this.name);	//箭头函数定义在sayNmae()中, this 的主体是dog对象的sayName()。正确打印 name 属性
		},1000)
	}
}
dog.sayName()  //this的主体是 dog,可以正确打印