JavaScript一些特点
- 单线程执行
- 解释性语言,解释一行执行一行
预编译
作用:可以进行初始化相关操作
原则(现象):函数声明整体提升; 变量 声明提升;
解释1:函数声明整体提升
test();//此时调用结果仍旧可以输出hello
function test(){
console.log('hello');
}
原因:函数声明时会提升自己的位置,置于Js脚本顶部
解释2:变量 声明提升
var a ;
console.log(a);//此时结果为undefined
a = 'hello';
console.log(a);//此时结果为undefined
var a = 'hello';
原因:变量声明时会提升自己的位置,第二个脚本的声明和赋值操作在一起,所以可以看作脚本一的效果一致,将脚本二的声明放置顶部。
预编译前奏
imply gobal(暗示全局变量)
在变量未经过声明,直接进行赋值
a = 10;
console.log(a);//此时输出仍为10,但是此时的a为window.a,其中window为全局的域
function test(){
var a = b =159;//其中b未声明,为window域所有
}
//输出window.a =undefined;
//输出window.b =159;
预编译详解(函数AO)
- 步骤
- 创建AO (Activation Object)活跃对象,也是执行期上下文
- 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
- 将实参与形参统一
- 函数体的函数声明,注意不是函数表达式
function fn(a){
console.log(a);//输出结果为function a(){}
var a =123;
console.log(a);//输出结果为123
function a(){};
console.log(a);//输出结果为123
var b = function(){}
console.log(b);//输出结果为function(){}
function d(){};
}
fn(1);
关注AO对象预编译的过程
阶段1
创建AO对象
阶段2
变量 | 值 | 原因 |
---|---|---|
a | undefined | 初始化 |
b | undefined | 初始化 |
阶段3
变量 | 值 | 原因 |
---|---|---|
a | 1 | 实参与形参统一 |
b | undefined | 不变 |
阶段4
变量 | 值 | 原因 |
---|---|---|
a | function a(){} | 函数声明 |
b | undefined | 不变 |
d | function d(){} | 函数声明 |
预编译详解(全局GO)
- 步骤
- 创建GO (Global Object)全局对象,可以理解为window === GO
- 函数体的函数声明,注意不是函数表达式
预编译详解(混合GO+AO)
- 预编译顺序:先生成GO对象,在执行方法前生成AO对象;
- 访问关系:先访问AO,若不存在则访问GO;(链式关系)
- 练习1
gobal = 100;
function fn(){
console.log(gobal);//undefined
gobal = 200;
console.log(gobal);//200
var gobal = 300;
}
fn();
var global;
- 练习2
function tests(){
console.log(b);//undefined(并不会报错,预编译时不考虑if)
if(a){
var b = 100;
}
console.log(b);
c = 234;
console.log(c);//234(为GO.c)
}
var a;
test();
a = 10;
console.log(c);//234
- 练习3
a = 100;
function demo(e){
function e(){};//undefined
arguments[0] = 2;
console.log(e);//2
if(a){
var b =123;
function c() {
}
}
var c;
a = 10;
var a;
console.log(b);//undefined
f = 123;
console.log(c);//undefined(function c(){})
console.log(a);//10
}
var a;
demo(1);
console.log(a);//100
console.log(f);//123
网友评论