深入了解JavaScript(预编译)

这几天在复习和深入学习JavaScript,天天写后端也写?了,把JS这块在好好的弄一下,再去学习前端的三大框架Vue然后独立做项目。什么时候才是个合格的全栈。。。。本文讲的是JavaScript的预编译。

JS入门

JS入门我觉得 对象、函数、数组、语句块、表达式和运算符、闭包、作用域、以及常的几个方法如:setInterval、setTimeout、对时间能够自由的任意转换、对dom能够轻松的增删改查 ,能简单的写很少的代码实现轮播图,将.json的数据显示到网页的表格上进行展示,能自由的提取json文件的内容,能用XMLHttpRequest发送数据给后端,或者定义个变量data去接受请求后端返回的数据(result) 对获取的数据能够进行拆分,JS原生的fetch和上面叙说的一样。这样我觉得就算是入门了,师傅领进门修行靠自己。

了解原理,修轮子

有多少人是真正的热爱技术,不仅把它学会,能用,而且知道为什么这个方法是这样的,我想很多人都是要用到它所以就去学习,至于原理都是一笔带过。其实包括我自己也是这样的,我后端很多东西都会,但是真让我去说这个接口是怎么实现的,我自己都说不出来。现在我每次不管是写前端代码还是后端的代码,每次看到方法(接口)都会自己点击进去看看内部是长什么样子的,原理也行工作的时候没有用,因为工作的时候是解决问题,但是面试的时候就会问你,比如问你,你知道JS原始类型有几种, typeof null 返回的类型是什么?返回的类型 为什么是object 不是 string。我认为了解语言本身自带的一些方法接口是有用的,当然最大的用处就是可以和别人吹牛逼,你会这个东西,你也了解是如何实现的。

JS预编译

脚本的预编译

一.没有var的变量 都不是变量声明,全部认为是window的全局变量。不参与预编译。
预编译只看声明变量的部分 不看赋值的部分 如下面

var result = aa;

此时会将result 加入window 只截取了 var result;部分 当预编译完成后 才会赋值为aa。

二.在函数中,只有当函数运行完毕时候才执行

test();
function test(){
   a = 22;
}
console.log(a);

如果你不掉test();那么将会报错:

  ReferenceError: a is not defined

三.在脚本中,所有声明的变量,在脚本预编译阶段完成,所有变量的声明与实际书写的位置无关 如下:

    console.log(result);
    var result = 100;
    console.log(result);

这三行代码并不会报错,有人会觉得第一行console.log会报错,但是实际上并不会报错,因为运行的时候会把var result 加入的window中 仅仅是加入,后面的 赋值并没有一起加入进行,此时在声明变量的上方进行输出打印是不会报错的而是输出了undefined,然后再次执行的时候 result 进行赋值操作 =100,下面打印的时候就输出了100。

四. 脚本中 ,所有函数的声明,在脚本的预编译阶段完成,所有变量的声明与实际书写的位置无关如下:

console.log(haha);
function haha(){
  console.log('h1');
}

此时会先去找变量haha是否存在,如果没有再去找函数haha是否存在

五. 在脚本中,如果变量与函数同名,函数会覆盖掉变量如下面

console.log(xixi);
var xixi = 'i like js';
function xixi(){
   console.log('no');
}

说明函数的优先级是高于变量的。如果方法和变量名相同,函数就会覆盖掉变量。
此时打印xixi,函数将会把变量覆盖,此时的打印的xixi是函数的

六. 在脚本中,只有函数能够覆盖变量,变量无法覆盖函数

七.在脚本中 后面的函数声明会覆盖前面的函数声明,并且忽略掉参数如下面

console.log(haha);
haha(1);
function haha(a){
console.log('haha1');
}
function haha(a,b){
  console.log('haha2');
}

JS是没有重载的概念,不想Java、C++其它的语言通过传参确定用的是哪个函数方法,此时打印出来的haha2

函数的预编译

一.在函数中,所有变量声明,在函数预编译阶段完成,所有的变量声明与实际的书写位置无关
二.函数中,所有函数的声明,在函数预编译阶段完成,所有的函数声明与实际的书写位置无关
三.函数中,如果变量与函数同名,那么函数将会覆盖到变量
四.函数中 只有函数能够覆盖变量,变量无法覆盖函数
五.函数中 后面的函数声明会覆盖前面的函数声明,并且 忽略掉参数
六.当函数预编译后,遇到需要访问的变量或者函数,优先考虑自己在AO中定义的变量和函数,如果找不到,才会在其定义的上一层AO(作用域链指Scope)中寻找。 直到 达到GO(window对象)
如下面:

var scope = 'global';
function t (){
      console.log(scope);//undefind
      var scope = 'local';
      console.log(scope);//local
}
t();
console.log(scope);

注意当函数退出的时候会被销毁。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点 深入理解JavaScript系列(2):揭秘命名函数表达式 深入理解JavaScript系列(3):全面解析Module模式 深入理解JavaScript系列(4):立即调用的函数表达式 深入理解JavaScript系列(5):强大的原型和原型链 深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP 深入理解JavaScript系列(7):S.O.L.I.D五大原则之开闭原则OCP 深入理解JavaScript系列(8):S.O.L.I.D五大原则之里氏替换原则LSP 深入理解JavaScript系列(9):根本没有“JSON对象”这回事! 深入理解JavaScript系列(10):JavaScript核心(晋级高手必读篇) 深入理解JavaScript系列(11):执行上下文(Execution Contexts) 深入理解JavaScript系列(12):变量对象(Variable Object) 深入理解JavaScript系列(13):This? Yes, this! 深入理解JavaScript系列(14):作用域链(Scope Chain) 深入理解JavaScript系列(15):函数(Functions) 深入理解JavaScript系列(16):闭包(Closures) 深入理解JavaScript系列(17):面向对象编程之一般理论 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现 深入理解JavaScript系列(19):求值策略 深入理解JavaScript系列(20):《你真懂JavaScript吗?》答案详解 深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP 深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP 深入理解JavaScript系列(23):JavaScript与DOM(上)——也适用于新手 深入理解JavaScript系列(24):JavaScript与DOM(下) 深入理解JavaScript系列(25):设计模式之单例模式 深入理解JavaScript系列(26):设计模式之构造函数模式 深入理解JavaScript系列(27):设计模式之建造者模式 深入理解JavaScript系列(28):设计模式之工厂模式 深入理解JavaScript系列(29):设计模式之装饰者模式 深入理解JavaScript系列(30):设计模式之外观模式 深入理解JavaScript系列(31):设计模式之代理模式 深入理解JavaScript系列(32):设计模式之观察者模式 深入理解JavaScript系列(33):设计模式之策略模式 深入理解JavaScript系列(34):设计模式之命令模式 深入理解JavaScript系列(35):设计模式之迭代器模式 深入理解JavaScript系列(36):设计模式之中介者模式 深入理解JavaScript系列(37):设计模式之享元模式 深入理解JavaScript系列(38):设计模式之职责链模式 深入理解JavaScript系列(39):设计模式之适配器模式 深入理解JavaScript系列(40):设计模式之组合模式 深入理解JavaScript系列(41):设计模式之模板方法 深入理解JavaScript系列(42):设计模式之原型模式 深入理解JavaScript系列(43):设计模式之状态模式 深入理解JavaScript系列(44):设计模式之桥接模式 深入理解JavaScript系列(45):代码复用模式(避免篇) 深入理解JavaScript系列(46):代码复用模式(推荐篇) 深入理解JavaScript系列(47):对象创建模式(上篇) 深入理解JavaScript系列(48):对象创建模式(下篇) 深入理解JavaScript系列(49):Function模式(上篇) 深入理解JavaScript系列(50):Function模式(下篇) 深入理解JavaScript系列(结局篇)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值