几分钟快速搞定:JavaScript预编译

    xiaoxiao2022-07-07  158

    JavaScript之预编译

    了解一点小知识: 1)为什么需要函数? 将代码封装成函数的形式,可以减少代码的耦合(编程追求的是高内聚,弱耦合) 2)和C语言一样,JS在使用函数之前,也要进行函数声明,示例代码如下:

    function sayHello() { console.log("hello world!") }

    3)函数表达式分为两种:一种是命名函数表达式,一种是匿名函数表达式

    //命名函数表达式 var say = function sayHello(){ console.log("hello world!") } //匿名函数表达式 var say1 = function(){ console.log("hello world!") }

    命名函数表达式与匿名函数表达式唯一的区别: console.log(say.name) ==> sayHello console.log(say1.name) ==> say1

    4)我们需要了解的是:【在执行一个函数之前,浏览器会做3件事】: a.语法分析:检查代码有没有低级错误(又会报错) b.预编译 c.解释执行:看一行翻译一行,执行一行

    现在进入主题【预编译】: 1.你需要知道 1)imply global【暗示全局变量】:即任何变量,如何变量未经声明就赋值,此变量就为全局对象所有; 2)一切声明的全局变量,全是window的属性,简单粗暴的来说,window就是全局 3)每个function都会生成一个自己作用域 2.预编译四部曲(注:预编译发生在函数执行的前一刻) 这是重点,一定要牢记四部曲哇! 这是重点,一定要牢记四部曲哇! 这是重点,一定要牢记四部曲哇! 重要的事情说三遍 a.创建AO【Activation Object】即活跃对象(作用域即执行期上下文); b.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined; c.将实参值和形参统一,即把实参的值传给形参; d.在函数体里面找函数声明,值赋予函数体。

    啥?啥?不要慌张,下面用一个简单的例子来分析一下预编译四部曲:

    function fun(a){ var b = 123; function c(){ var d = 234; } } fun(6);

    预编译过程: a.在函数fun运行前的一瞬间,生成一个AO对象 fun.AO = {}; b.分析参数(假如没有,略过) fun.AO ={ a : 6 } c.分析变量(假如没有,略过) fun.AO ={ a : 6, b : undefined } d.分析函数声明(假如没有,略过),最终: fun.AO ={ a : 6, b : undefined, c : function(){ var d = 234; }

    上面是一个简单的例子,试着分析一下下面这段代码吧:

    function fn(){ console.log(a); var a = 123; console.log(a); function a(){} console.log(a); var b = function(){} console.log(b); function d(){} } fn(1); //上段代码,在控制台的输出如下: function a(){} 123 123 function(){}

    3.预编译不仅发生在函数体,还发生在全局。其过程与函数体的预编译过程相似(不要第三步). 注:其生成一个GO【Global Object】; 在找变量声明时,将变量作为GO属性名,值为undefined.

    最新回复(0)