文章目录
  1. 1. javascript 执行过程
  2. 2. 预编译
    1. 2.1. 一切申明的全局变量,全是window的属性
    2. 2.2. 如果变量未经申明就赋值,此变量为window的属性
  3. 3. 预编译过程

javascript 执行过程

我们着重说下预编译

预编译有全局预编译和函数预编译

函数预编译发生在函数执行的前一刻

预编译不受if等逻辑判断的影响,正常按照规则执行预编译

预编译

函数申明整体提示 变量申明提升

预编译不仅发生在函数体,还发生在全局。全局没有第三部,第一部创建GO

一切申明的全局变量,全是window的属性

1
2
3
4
5
6
7
8
9
10
//任何申明的全局变量,归window所有  全是window的属性
var a = 123;
//预编译赋值给Window对象
// window{
// a:123
// }
//window.a和a之间有了引用联系
a = 10;
window.a = 10;
console.log(a)//window.a

如果变量未经申明就赋值,此变量为window的属性

1
2
3
4
5
6
function test(){
//从右向左赋值 这样的 b未经赋值 b归window所有
var a = b = 123;
}
test();
console.log(window.b);

预编译过程

1、创建AO对象(执行期上下文)

2、找形参和变量申明,将变量和形参名作为AO属性名,值为Undefined

3、将实参值和形参统一

4、在函数体里面找函数申明,值赋予函数体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//1、创建AO对象
//2、找形参和变量申明,作为AO属性名赋值undefined
//AO{
// foo:undefined
//}
//3、实参和形参统一
//4、找函数申明体,值赋予函数体
//AO{
// foo:function foo(){}
//}
//输出应该是函数体
function bar(){
return foo;
foo=10;
function foo(){}
var foo=11;
}
console.log(bar());
文章目录
  1. 1. javascript 执行过程
  2. 2. 预编译
    1. 2.1. 一切申明的全局变量,全是window的属性
    2. 2.2. 如果变量未经申明就赋值,此变量为window的属性
  3. 3. 预编译过程