js特点:
1.弱类型 不需要声明数据类型
2.解释型
语法分析-->预编译-->解释执行
预编译
GO(Global Object)
1.代码在执行前的一瞬间,产生GO对象
2.分析变量声明,变量名为GO对象的属性名,值为undefined
3.分析函数声明,函数名作为GO对象的属性名,值为函数体
AO(Active Object)
1.函数运行前一瞬间 产生AO对象。
2.分析参数 ,形参作为AO对象的属性名,实参作为AO对象的属性值。
3.分析变量声明,变量名作为AO对象的属性名,值为undefined,遇到同名不做任何改变(以第一次调用为主)。
4.分析函数声明,函数名作为AO对象的属性名,值为函数体,遇到同名,直接覆盖。
<script type="text/javascript">
function test(a,b){
console.log(a);//f a(){}
console.log(b);//undefined
var b=234;
console.log(b);//234
a=123;
console.log(a);//123
function a(){}
var a;
b=456;
var b=function(){}
console.log(a);//123 变量 遇到同名,不做任何改变
console.log(b);//function
}
test(1);
console.log("===============");
function demo(e){
function e(){}
arguments[0]=2;
console.log(e);//2
if(a){
var b=123;
function c(){}
}
var c;
a=10;
var a;
console.log(b);//undeined
f=123;
console.log(c);//undeined
console.log(a);//10
}
var a;
demo(1);
</script>
预编译
function fun(){
console.log(a);//f a(){}
if(false){
//var a;//预编译不会受if判读影响
function a(){}//function如果写在if中,提升受到兼容性的影响 undefined 不遵循w3c->function
}
}
fun();
3.形参和arguements会形成映射关系
function fun3(a,b){
//'use strict'//严格模式 开发过程可以开启 但是线上环境是必须关掉
arguments[0]=10;
console.log(a);//10 use strict==>1
}
fun3(1);
注意:
1.预编译的过程不会受if for……只会受function影响
2.function如果写在if中,提升会受浏览器兼容性的影响
3.形参和arguements会形成映射关系
3.1 只有形参和实参个数统一的时候才能形成映射关系,不统一不能形成迎神
3.2 开启了严格模式,形参和arguements不能形成映射关系