设置函数默认值
/*
function fun(n,m){
return n+m;
}
let result=fun();//没有参数时n和m的值都是defined
console.log(result);//NaN Not a Number
*/
function fun(n=10,m=20){//设置默认值
return n+m;
}
let result=fun();//没有参数时就以默认值计算
console.log(result);//30
立即执行函数
声明后立即被调用,且无法再次被调用,用完一次就没了。
作用域链
类似于全局变量和局部变量,就近原则,从内往外找
闭包
函数里的函数就是闭包,如fun2
封装体现在外部可以调用闭包函数fun2,但是无法调用其中的变量n、m
f的结果是fun2,所以f();的结果是调用fun2函数
闭包的特性体现在f=fun1();表明外部函数已经执行完了
但因为后面还有内部函数result=f();没执行,所以还没有销毁里面的变量
代码封装
外部通过module调用add,但是无法获取变量ab,从而实现封装。这是老代码的写法,看懂就行
箭头函数
- 简化写法
/*
const fun = function(x){
return x*x;
}*/
//箭头函数
const fun = x => x*x;//如果变量有两个以上就要加括号,const fun = (x,y) => x*y;
- this
const cat={
name:"mao",
sayName(){
setInterval(function(){//每个一秒输出cat的name
console.log(this.name);//但是发现什么也没输出
},1000);
}
};
cat.sayName();
什么也没输出的原因是setInterval是window对象的方法,console.log(this.name)的this指的是window,而window没有name属性
要想让this指的是cat,可以定义一个变量
const cat={
name:"mao",
sayName(){
let self=this;//指向cat
setInterval(function(){
console.log(self.name);//self指向cat,也可以不用self,而知cat.name
},1000);
}
};
cat.sayName();
但这样很麻烦,加了个变量,这时可以用箭头函数的特性
const cat={
name:"mao",
sayName(){
setInterval(() => {//sayName没有参数就用()表示
/*
普通函数指向的是调用该函数的对象,这里是setInterval调用的console
所以this指向setInterval的对象window
箭头函数:在哪定义(它只会在自己作用域的上一层继承this),this就指向谁。
它作用域的上一层是sayName(){},所以它在sayName中继承this,继承了cat的this
箭头函数是在sayName函数中定义的,this指向sayName的对象cat
*/
console.log(this.name);//mao
},1000);
}
};
cat.sayName();
标签:console,进阶,函数,sayName,fun,cat,name
From: https://www.cnblogs.com/ben10044/p/16827790.html