js的执行过程
解析语法
- 若语法错误直接报错
// 此为语法错误 将不会打印 hello
// 而是直接 打印 Uncaught SyntaxError: Unexpected identifier
console.log('hello')
vac b;
// SyntaxError: Unexpected token ';'
console.log(hello)
const obj={
name;zhangsan
}
js的预编译
生成 GO(Global Object)
- 全局扫描将 var 和 function 放入GO中
- var定义的变量先设置为undefined
- 是function的则直接将function写入AO(这就是你即使function在最底部 而你调用在上面也是可以调用的)
//1. GO{
// a:undefined,
// c :function c(){}
// }
var a=123;
function c(){
}
//2. GO{
// a:123,
// c :function c(){}
// }
// 若 有变量和函数名字相同时
//1. GO{
// a:function c(){},
// }
var a=123;
function a(){}
//2. GO{
// a:123,
// }
// 调用function
a(); // hello
function a(){
console.log('hello')
}
// 若使用 const定义的function则预编译不会放入AO中
a(); // Cannot access 'a' before initialization
const a=function (){
console.log('hello');
}
// a(); // hello 若将上面的a()注释掉将下面的打开则可以正常使用打印
js的执行
- 解释性执行。就是一行一行的读取代码执行代码。
// 同步无异步
// GO{
// name:undefined,
// fn :function fn(){}
// }
fn(); // 进入fn();
var name='zhangsan';
// GO{
// name:'zhangsan',
// fn :function fn(){}
// }
function fn(){
// GO{
// name:undefined,
// fn :function fn(){}
// }
/*
* AO {
* c:undefined;
*
* }
* */
console.log(c) // undefined
console.log(name) // undefined
var c=2;
console.log(c)
/*
* AO {
* c:2;
*
* }
* */
}
/*
GO{
name:undefined,
fn :function fn(){}
}
* */
fn(); // 进入fn();
var name='zhangsan';
/*
GO{
name:'zhangsan',
fn :function fn(){}
}
* */
function fn(){
/*
GO{
name:undefined,
fn :function fn(){}
}
* */
/*
AO {
c:undefined;
}
* */
console.log(c) // undefined
console.log(name) // undefined
var c=2;
/*
AO {
c:2;
}
* */
console.log(c)
}