JavaScript执⾏过程
JavaScript整个执⾏过程,分为两个阶段,代码编译阶段和代码执⾏阶段
1. ⼀、编译阶段
编译阶段由编译器执⾏,将代码翻译成可执⾏代码,这个阶段确定作⽤域规则。
变量的预编译只作声明,不作初始化,初始化在执⾏时
function语句定义的函数,不仅声明了函数名,⽽且函数体也进⾏了处理
⼆、执⾏阶段
执⾏阶段由引擎完成,主要任务是执⾏可执⾏代码,执⾏上下⽂在这个阶段创建。执⾏上下⽂也分为创建阶段和执⾏阶段。
1、执⾏上下⽂
执⾏上下⽂可以理解为当前代码的执⾏环境,它会形成⼀个作⽤域。
2、三种类型
a、全局执⾏上下⽂:浏览器的全局对象是window对象,this指向这个全局对象
b、函数执⾏上下⽂:存在⽆数个,只有在函数被调⽤的时候才会被创建,每次调⽤函数都会创建⼀个新的执⾏上下⽂,函数上下⽂的变量对象初始化只包括 Arguments 对象。
c、Eval函数执⾏上下⽂:指运⾏在eval函数的代码,很少⽤⽽且不建议使⽤。。
创建阶段:
确定this的值,也被成为 This Binding;
This Binding
a、全局执⾏上下⽂中,this 指向全局对象,在浏览器中this 指向window对象,在nodejs中指向这个⽂件的module 对象。
b、函数执⾏上下⽂中,this的值取决于函数的调⽤⽅式。具体有:默认绑定、隐式绑定、显式绑定、new绑定、箭头函数。
变量提升
例⼀:变量提升
foo();  // 报错
var foo = function () {
console.log('foo1');
}
foo();  // foo1,foo重新赋值
var foo = function () {
console.log('foo2');
}
foo(); // foo2,foo重新赋值
复制代码
javascript全局数组
函数提升
例⼆:函数提升
foo();  // foo2
function foo() {
console.log('foo1');
}
foo();  // foo2
function foo() {
console.log('foo2');
}
foo(); // foo2
复制代码
函数 > 变量
例三:声明优先级,函数 > 变量
foo();  // foo2
var foo = function() {
console.log('foo1');
}
foo();  // foo1,foo重新赋值
function foo() {
console.log('foo2');
}
foo(); // foo1
复制代码
需要注意
需要注意的是同⼀作⽤域下存在多个同名函数声明,后⾯的会替换前⾯的函数声明。
三、执⾏上下⽂栈
管理执⾏上下⽂。
栈(Execution context stack,ECS)来管理
因为JS引擎创建了很多的执⾏上下⽂,所以JS引擎创建了执⾏上下⽂栈
全局执⾏上下⽂,我们⽤ globalContext 表⽰它,并且只有当整个应⽤程序结束当 JavaScript 初始化的时候会向执⾏上下⽂栈压⼊⼀个全局
的时候,执⾏栈才会被清空,所以程序结束之前, 执⾏栈最底部永远有个 globalContext。
ECStack = [        // 使⽤数组模拟栈
globalContext
];复制代码
当执⾏⼀个函数的时候,就会创建⼀个执⾏上下⽂,并且压⼊执⾏上下⽂栈,当函数执⾏完毕的时候,就会将函数的执⾏上下⽂从栈中弹出。
var scope = "global scope";
function checkscope(){
var scope = "local scope1";
function f(){
console.log(scope);
}
return f(); //执⾏
}
checkscope();
var scope = "global scope";
function checkscope(){
var scope = "local scope22";
function f(){
console.log(scope);
}
return f; //返回function
}
checkscope()();复制代码
第⼀段代码:
ECStack.push(<checkscope> functionContext);//执⾏checkscope ECStack.push(<f> functionContext);//执⾏f
ECStack.pop();//弹出f
ECStack.pop();//弹窗checkscope复制代码
第⼆段代码:
ECStack.push(<checkscope> functionContext);//执⾏checkscope ECStack.pop();//返回function
ECStack.push(<f> functionContext);//执⾏f
ECStack.pop();//返回f复制代码

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。