javascript中最难最恶心的也就是函数了,那就来说说函数吧
console.log(func); //undefiend
{
function func() {}
foo = 1;
}
console.log(func); //function func(){}
// 这个怎么理解呢,除了(obj,function)出现的大括号,其他的大括号中,出现的 大括号, 如果出现var,function函数都是会出现变量提升但在大括号之前不赋值,所以会出现undefiend,
//遇见大括号,就会出现下面几步,1.会开辟作用域,2.变量提升,3.实例化this,arguments,4.执行代码块
// 一切函数按照这样的思路做就不会出错,那接下来解释一下函数中的大括号,如果函数大括号中出现let/const/var 如果有形参,那么let/const不能跟形参名字一样要不然就会报错而如果出现var
// 则不会报错,如果没有出现以上情况则会开辟两个作用域,第一个是函数私有上下文,第二个则是block作用域,里面存放var/let/const出的变量,但是还是做一个什么操作呢,如果函数体内有var出
// 的变量跟形参相同,那么先会把函数私有的值赋给block,然后修改的是block中的值,并不是函数私有作用域中的值,如果block里面不存在就回去函数作用域中找,找到了就修改函数作用域中的值,
//要不然则一层一层网上找,直到找到GO(window),那就看看下面的函数
var x=3;
function func(x,y=function(){x=2}){
var x=8;
console.log(x)//8
}
func(5)
var x=3;
function func(x,y=function(){x=2}){
x=4;
console.log(x)//4
}
func(5)