一.代码分类
全局代码:该代码在整个文档中都能访问的到
函数代码:又称为局部代码,只能在当前对象中能访问的到。
二,函数申明与变量申明
function a(){
}
//使用function申明函数
var a;
//使用var关键字申明变量,值为undefined
三.当要执行全局代码时(全局上下文执行)
步骤1:在执行全局代码前将window确定为全局上下文
console.log(a === window.a)//true 使用var申明了变量在代码执行前就会把变量a添加为window的属性
console.log(a)//undefined ,因为变量a被添加为window的方法了,代码是在window后执行
var a = 1;//使用了var关键字申明了变量,并且赋值。
步骤2:对全局代码进行预处理(执行代码之前浏览器的准备工作)
将var申明的全局变量,添加为window的属性,但是没有赋值。
将function申明的全局函数赋值,并添加为window的方法,已经赋值。
将this方法赋值为window
var a;//申明变量
function b(){}//申明函数
console.log(a)//undefined
console.log(a === window.a)//true
//将var申明的全局变量,添加为window的属性,但是没有赋值(值为undefined)。
console.log( (b()) === (window.b()) )//true
//将function申明的全局函数赋值,并添加为window的方法,已经赋值。
console.log(this === window)//true
//将this方法赋值为window
步骤3:执行全局代码代码
四.当调用函数时 函数执行上下文(执行局部代码)
步骤1:在调用函数,准备执行函数体之前,创建对应函数执行上下文代码块,这个代码块作用和全局上下文的window对象一样,当函数调用的时候就会开启,然后函数调用完之后就会释放掉。(这是一个虚拟的,为了方便理解自定义的)
步骤2:这个对象对局部数据进行预处理(在全局上下文的基础上多了arguments,和实参)
将实参赋值给形参,然后将该形参添加为该函数的属性,实参赋值给该属性的值
将arguments(伪数组,是每个函数都有的属性,里面存着的实参)该属性添加为当前函数的属性
将var申明的全局变量,添加为window的属性,但是没有赋值。
将function申明的全局函数赋值,并添加为window的方法,已经赋值。
将this方法赋值为window
步骤3:开始执行函数