您的位置:首页 > Web前端 > JavaScript

JS的解析与执行——全局预处理

2017-12-13 15:59 239 查看
JS的的解析与执行主要分为两个阶段,一是预处理阶段,二是执行阶段。JS代码的执行并不是读取一行代码处理一行代码。在正式执行代码这个阶段之前有一个预处理阶段。在预处理阶段,我们人为分成全局代码和函数内部代码。因为两者有少许差别,因此我们分开讲解。今天我们主要讲全局预处理。

全局预处理就的第一步是创建Lexical Environment(词法环境)对象。第二步是扫描全局的js代码里面的两部内容(用声明的方式创建的函数和用var定义的变量)。通常是先扫描函数声明后扫描var声明的变量。第三步将扫描到的内容添加到Lexical Environment中。

什么是用声明的方式创建的函数呢?举个栗子。

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>全局预处理</title>
</head>
<body>

<script>

foo();
g();

function foo(){

console.log("用声明的方式创建的函数");
}

var g = function(){
console.log("函数表达式");
}

</script>

</body>
</html>

在浏览器中,LexicalEnvironment === window。

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>全局预处理</title>
</head>
<body>

<script>

console.log(a);

var a=5;
b=6;

console.log(window.b);

</script>

</body>
</html>


既全局预处理阶段会把用声明的方式创建的函数和用var声明的变量加入到Lexical Environment中。例如:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>全局预处理</title>
</head>
<body>

<script>

console.log(a);
var a=5;

foo();

function foo(){

console.log("foo");

}

</script>

</body>
</html>

Lexical Environment{

    a:undefined

    foo:对函数的一个引用

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: