Javascript重温OOP之JS的剖析与实行历程

相识js面向对象编程之前,起首要相识js的实行递次。js的剖析历程分为两个阶段:预处置惩罚阶段与实行期。

预处置惩罚阶段

在预处置惩罚阶段,js会起首建立一个实行上下文对象(Execute Context,然后扫描声明式函数和用var定义的变量,将其到场实行上下文环境中,看下面栗子:

var a = 5; 
b = 1;
function f(){}
var g = function(){}

//实行上下文对象
/*Execute Context{
    a: undefined
    f: 对函数的援用
}*/

从上面能够看出,js在预处置惩罚阶段建立了一个预处置惩罚对象,将声明式函数和var定义的变量放入个中,这里疏忽了没有用var声明的b以及函数表达式 g。

alert(a);  // undefined
alert(b);    // 报错 b in not defined
alert(c);    // 函数体被打印出来
alert(d);    // 报错

var a = 1;
b = 5;
function c(){
    console.log('c');
}
var d = function(){
    console.log('d');

}

从上面例子的输出效果就能够看出js预处置惩罚阶段做了哪些事变,关于没有加进函数变量预处置惩罚阶段的变量或函数,会直接报错。

关于争执处置惩罚有两种状况:

  • 处置惩罚函数声明有争执时,会掩盖前面

  • 处置惩罚函数变量声明有争执时,会直接疏忽

alert(f); // 弹出function f(){console.log('fff');}
function f(){
    console.log('ff');
}

var f = 10;

function f(){
    console.log('fff');
}

总结一句话:函数是js里的第一等国民。

实行阶段

在实行阶段中,js会先扫描函数声明后扫描变量,然后给预处置惩罚阶段中实行上下文对象中的成员赋值,假如没有用var声明的变量,会成为外部实行上下文的成员。

alert(a);
alert(f);
var a = 1;
function f(){}

//在实行阶段的实行上下文对象
/*{
    a: 1; // 由undefined赋值为1
    f: 指向对应函数
}*/
    原文作者:Allin
    原文地址: https://segmentfault.com/a/1190000006069625
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞