js 语言特点
解释性语言 解释一句执行一句
作用域定义:变量(变量作用于又称上下文)和函数生效(能被访问)的区域
全局、局部变量
作用域的访问顺序
预编译
函数无论在哪里声明都会提升到最前面
对于变量来说 提升的只有声明 而赋值不提升 要等待执行过程
预编译前提
1.imply global 暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象所有。
eg: a = 123; eg: var a = b = 123;
2.一切声明的全局变量,全是window的属性。(window就是全局的域)
eg:var a = 123; ===> window.a = 123;
function test() {
var a = b = 3;
}
test();
// b未经声明赋值 属于暗示全局变量 归window所有
//但是a 虽经过声明 但他属于局部变量
函数预编译
四部曲:
1.创建AO对象
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3.将实参值和形参统一
4.在函数体里面找函数声明,值赋予函数体
预编译发生在函数执行前一刻
此时已经完成了AO对象创建 开始执行函数 赋值
以上为函数中的预编译环节 对于全局来讲 换创建一个 GO(global Action) === window
1.创建GO对象
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3.将实参值和形参统一
4.在函数体里面找函数声明,值赋予函数体
恶心的搞法
注意 预编译忽略一切结构 if for
注释 当函数内部拥有自己的global时 会调用自己AO里面的 global 而不是全局window里面的
百度笔试试题
打印undefiend 走变量的编译过程