5分钟懂一个前端知识点系列之预编译


theme: channing-cyan

前言

预编译是JavaScript中一个重要的概念指的是在代码实际执行之前,JavaScript引擎会先进行一系列的准备工作,以确保代码能够按照预期运行。这个过程主要包括变量声明的提升(hoisting)和函数声明的提升,以及执行环境的初始化全局预编译函数预编译也不太相同,今天通过5分钟就让你搞懂这个知识点。

全局预编译

我先讲一下这里全局预编译的过程:

1. 创建全局执行上下文对象 GO

2. 找变量声明,变量名作为Go的属性名,值为undefined( 变量提升 )

3. 在函数声明,函数名作为Go的属性名,值为函数体

这里属性和方法名都是存在GO对象中,你要先明白一个先前知识点就是对象中不能存在相同的属性名,如果已经存在了则会对之前的属性值进行覆盖.比如

obj.a =1
obj.a =2
console.log(a)//这里打印的是2

是不是很简单,我们一起用一个例子来先试试看。

console.log(str);
var str ="123";
console.log(str);

来!跟着我一起按照上面的步骤思考一下答案:

    1-首先全局编预译在全文创建一个函数体
    GO ={
    }
    2-找变量声明,变量名作为Go的属性名,值为undefined( 变量提升 )
    //这里就将str进行变量提升
    GO ={
        str : undefined
    }
    3-在函数声明,函数名作为Go的属性名,值为函数体
    //这里没有函数所以就可以跳过啦
    全局预编译就完成了!
    
    预编译完成之后然后就开始执行代码编译部分
    首先遍历到console.log(str);
    此时str的值为undefined,所以打印的是undefined,
    然后遍历var str ="123",则obj对象里面的str就变成了123.
    GO ={
        str :"123"
    }
    最后执行打印str就输出打印123

是不是感觉很简单,接下来跟我一起来一点进阶的

    console.log(f);
    var f = 123;
    console.log(f);
    function f(){}
    console.log(f);

注意别掉队,要开始发车了!

 1-首先全局编预译在全文创建一个函数体
 GO ={
 }
 2-找变量声明,变量名作为Go的属性名,值为undefined( 变量提升 )
 GO ={
     f : undefined
 }
 3-在函数声明,函数名作为Go的属性名,值为函数体
 GO ={
     f : function f(){}
 }
 
 预编译完成,开始执行代码
 console.log(f);//打印function f(){}
 var f = 123;//赋值f为123
 则GO ={
     f:123
 }
 console.log(f);//打印为123
 function f(){}//这里只是方法声明,在预编译已经执行完成,所以这里不执行
 console.log(f);//打印123

如何?你有没有写对呢?

函数预编译

函数预编译就是执行函数时开始进行,而不是声明函数时开始预编译这个要搞明白。

我先讲一下这里函数预编译的过程:

1-创建一个AO对象

2-寻找变量,GO对象里面创建属性为变量,初始化赋值为undefined(进行变量声明( 变量提升 ))

3-形参和实参进行统一(将GO里面创建属性为形参的名字,值为形参值)

4-寻找函数声明,GO对象里面创建属性为函数名,初始化赋值为function 变量名(){}(进行函数声明(函数提升,整体提升))

老规矩先来一个简单题:

function fn(str){
    console.log(str);
    var str ="123";
    console.log(str);
    function str(){
    }
}
fn("abc");
1-创建一个AO对象
AO ={}

2-寻找变量,GO对象里面创建属性为变量,初始化赋值为undefined(进行变量声明( 变量提升 ))
AO ={
    str : undefined;
}

3-形参和实参进行统一(将GO里面创建属性为形参的名字,值为形参值)
AO ={
    str :"abc"
}

4-寻找函数声明,GO对象里面创建属性为函数名,初始化赋值为function 变量名(){}
AO ={
    str :function str(){}
}

预编译已完成开始执行代码
第一行console.log(str)则打印的是function str(){}

第二行进行str赋值为123

第三行console.log(str)则打印则是123

第四行函数声明不执行

你以为我要开始第二个简单题了吗?错!我开始出一题融合难题给你了

首先我的再次声明函数预编译就是执行函数时开始进行,而不是声明函数时开始预编译这个要搞明白。
所以顺序是先全局预编译,然后进行代码执行,执行到函数方法时,才开始函数预编译!如果局部对象中不存在的属性将会去上一级对象中查找,直到查找到全局对象。 没有则报错!

综合题

console.log(str);
var str;
str();
function str(str){
    console.log(str);
    str =123;
}
console.log(str);

老规矩开始分析

1. 创建全局执行上下文对象 GO
GO ={}
2. 找变量声明,变量名作为Go的属性名,值为undefined( 变量提升 )
GO ={
    str : undefined
}
3. 在函数声明,函数名作为Go的属性名,值为函数体
GO ={
    str : function str(){}
}

全局预编译完成!开始执行代码
第一行 console.log(str)打印function str(){}
第二行 var str;变量声明并没有进行赋值操作则不执行
第三行 str();开始执行str函数
进行函数预编译

    1-创建一个AO对象
        AO ={}
    2-寻找变量,GO对象里面创建属性为变量,初始化赋值为undefined(进行变量声明( 变量提升 ))
        没有变量声明则不操作
    3-形参和实参进行统一(将GO里面创建属性为形参的名字,值为形参值)
        没有形参则不操作
    4-寻找函数声明,GO对象里面创建属性为函数名,初始化赋值为function 变量名(){}
        没有函数声明则不操作
        
    开始执行函数代码
    console.log(str);AO对象中没有str属性则去上一级对象中也就是全局对象找str,找到打印
    function str()
    
    str =123 没有str属性则去上一级对象中也就是全局对象找str,赋值123
函数执行完毕
    
console.log(str);打印123

怎么样你想对了没!

总结

通过预编译,JavaScript引擎能够准确地知道哪些变量和函数在哪个作用域内可用,有助于避免变量污染和命名冲突。总的来说是必须掌握的知识。如果你能把上面的例子都理解明白的话我相信你可以掌握这个知识点了。如果还喜欢的话请点赞和关注吧!以后也会更新5分钟系列的>_<.

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当然,以下是 TypeScript 前端开发中的十个重要知识点: 1. 类型系统:TypeScript 是 JavaScript 的超集,它引入了静态类型检查,可以在编译时捕获潜在的类型错误,并提供更好的代码补全和文档。 2. 接口和类型:TypeScript 提供了接口和类型(type)来定义自定义数据结构和对象的形状。它们可以用于强制编译时类型检查和类型推断。 3. 类和继承:TypeScript 支持类和继承,让你可以使用面向对象的编程范式来组织和管理代码。 4. 泛型:泛型允许你编写可重用的代码,可以在不同类型之间共享相同的逻辑。它在创建通用数据结构和函数时非常有用。 5. 模块化:TypeScript 原生支持 ES 模块规范,可以帮助你将代码拆分为多个可重用的模块,并提供更好的代码组织和封装。 6. 异步编程:TypeScript 提供了异步编程的支持,包括 Promise、async/await 和生成器等语法糖,使得处理异步操作更加简洁和可读。 7. 枚举类型:枚举类型允许你定义一组命名的常量,并将它们作为一种数据类型使用。这在需要表示一组相关的变量时非常有用。 8. 类型推断:TypeScript 的类型系统可以根据上下文自动推断变量的类型,减少了手动类型注解的工作量,并提供更好的开发体验。 9. 类型声明文件:TypeScript 可以使用类型声明文件(.d.ts)来描述 JavaScript 库的类型信息,从而提供更好的代码补全和类型检查。 10. 第三方库和工具支持:TypeScript 生态系统非常丰富,支持大多数常用的前端库和工具,如 React、Vue、Webpack 等,使得开发和维护前端项目更加便捷。 这些知识点涵盖了 TypeScript 前端开发的核心概念和特性,希望对你有所帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绯雨934

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值