1.函数参数默认值
///es5
function test(a,b){
var a=arguments[0] || 1
var b=arguments[1] || 2
console.log(a);
console.log(b);
}
test()//1 2
test(3,4)//3 4
//es6
function test(a=1,b=2){
console.log(a);
console.log(b);
}
test()//1 2
test(3,4)//3 4
2.递归
function fact(n){
if(n===1){
return 1
}
return n*fact(n-1)
}
console.log(fact(5));
// 解析:
当n===1时,执行队列,也就是fact(1),不写结束条件的话就是死循环,栈溢出。
fact(5)=5*fact(4)
fact(4)=4*fact(3)
fact(3)=3*fact(3)
fact(2)=2*fact(1)
3.变量提升
1.检查通篇语法错误 2.预编译 3.解析一行,执行一行
console.log(a); //语法报错
console.log(a); //undefined ,变量提升
var a
console.log(a); //undefined ,变量提升,但是赋值不提升
var a=10
4.预编译
函数执行上下文
1.寻找形参和变量声明
2.实参赋值给形参
3.寻找函数声明并赋值
4.执行
function test(a){
console.log(a);
var a=1
console.log(a);
function a(){}
console.log(a);
var b=function(){}
console.log(b);
function d(){}
}
test(2)
执行结果:
ƒ a(){}
demo.html:24 1
demo.html:26 1
demo.html:30 ƒ (){}
// 解析
第一步:寻找形参和变量声明
{
a:undefined
b:undefined
}
第二步:实参赋值给形参
{
a:undefined ==>2
b:undefined
}
第三步:寻找函数声明并赋值
{
a:undefined ==>2 ==>function a(){}
b:undefined
d:function d(){}
}
第四步:执行
{
a:undefined ==>2 ==>function a(){} ==>1
b:undefined ==>function(){}
d:function d(){}
}
全局执行上下文
1.寻找变量声明
2.寻找函数声明并赋值
3.执行
var a=1
function a(){}
console.log(a);
执行结果:1
// 解析
第一步:寻找变量声明
{
a:undefined
}
第二步:寻找函数声明并赋值
{
a:undefined ==>function a(){}
}
第三步:执行
{
a:undefined ==>function a(){}==>1
}
5.构造函数
1.基本使用
function Person(){
this.name="foo";
this.age=18;
this.say=function(){
console.log("I am saying");
}
}
const person1=new Person()
const person2=new Person()
console.log(person1); //Person{...}
console.log(person2); //Person{...}
console.log(person1===person2); //false
//又称工程函数,在构造函数没有执行的时候,this指向windos,当执行的时候,this指向他的实例化对象person,每一个实例化对象都是不同的,互补影响
2.传参
function Person(options){
this.name=options.name;
this.age=options.age;
this.say=function(){
console.log("I am saying");
}
}
const person=new Person({
name:'foo',
age:18
})
console.log(person);//Person{...}
\