作用域
越往里面的函数变量权限越大;
预编译
js是什么性质语言也就是其特点:解释性语言、单线程;
解释性语言:翻译一句执行一句;
解释性语言特点:跨平台(带尖角号的都是解释性语言);不足:稍微慢;
单线程:(同一时间只能做一件事);
单线程特点:在计算机里异步是同步,同步是异步;
js三部曲:
1、语法分析:通篇扫描但不执行(主要看有没有低级语法错误,如少个括号,写成中文等);
2、预编译:函数声明整体提升,变量声明提升,imply global 暗示全局变量,即任何变量未经声明就赋值,此变量为全局对象所有全局上的变量声明了也归window所有,window就是全局的域;
赋值的过程是自右向左的;
预编译四部曲(函数预编译四部曲):
预编译发生在函数执行的前一刻;
1、创建AO对象(Action Object)即执行期上下文;
AO {
}
2、找行参和变量声明,将变量和行参名作为AO属性名,值为undefined;
3、将实参值和行参统一;
4、在函数体里面找函数声明,值赋予函数体(注:函数声明和函数表达式是两回事)
创建AO对象就是作用域问题;
例子:
function fn(a){
console.log(a);
var a = 123;
console.log(a);
function a () {}
console.log(a);
var b = function() {}
}
fn(1);
console.log(b);
预编译全局四部曲:
生成GO对象(global object)
GO === window
先生成GO 后生成AO
GO 只执行1、2、4步骤
预编译就是解决执行顺序的问题;