/*
-----------------------------javascript----xx is not defined----undefined-------
undefined是基本数据类型中的一种,不是错误。
is not defined 是浏览器引擎报的错误。{遇到没有定义就用来运算的变量}
console.log(xx); 报错 xx is not defined
console.log(window.xx); 输出 undefined
打印undefined说明该变量已经声明,但没有赋值;打印is not defined异常说明该变量连声明都没有。通过这条结论说明,window.xx的形式会在window对象中隐式的声明该变量。
/*
-----------------------------javascript----xx is not defined----undefined-------
undefined是基本数据类型中的一种,不是错误。
is not defined 是浏览器引擎报的错误。{遇到没有定义就用来运算的变量}
console.log(xx); 报错 xx is not defined
console.log(window.xx); 输出 undefined
打印undefined说明该变量已经声明,但没有赋值;打印is not defined异常说明该变量连声明都没有。通过这条结论说明,window.xx的形式会在window对象中隐式的声明该变量。
------------------词法分析 就是变量声明提升和函数声明提升---------------------------------
变量声明提升:必须是var声明的
函数声明提升:不是函数表达式,函数声明内部也存在变量声明提升和函数声明提升,只是局部的。
根据词法分析,函数在执行之【前】的瞬间,会生成一个活动对象Active Objec(AO)
作用域内能找到的所有变量都在AO上。
1、分析参数:
函数接受形参,添加到AO的属性,并且这个属性值为undefined
函数接受实参,添加到AO的属性,覆盖之前的undefined
2、分析局部变量声明
如果上一步分析参数中AO,还是没有此时的变量,则会追加新的属性,并且值为undefined,
如果AO上面已经存在该属性,则不作任何修改。
3、分析函数的声明
如果有函数声明,同时AO上存在相同的属性名,则覆盖,没有则追加新的属性到AO上,
*/
上面 形参之后漏个实参 a=’abc‘,结果不变,因为后面都有布局变量提升
补充一个 虽然jQuery 现在已经不太景气了,但里面思想还是值得我们研究的
(function(window,undefined){
})(window)
上面的IIFE 函数,
为啥要传window,而又不传undefined呢。
1、传window 为了效率。
2、不传undefined是为了安全,在ie、火狐低版本中,undefined竟然可以重新赋值,如:undefined=3,
声明undefined局部变量(名字是undefined而已),同时又不传参,值自然是undefined,防止外界对undefined这个值造成污染
产生闭包 外边函数调用一次,产生一个闭包,跟内部函数调用次数无关【外部函数调用之后,内部的函数声明就会在外部执行之前,把函数声明定义执行了一次,所以就产生了闭包】