解析函数

JavaScript 预解析机制

别来无恙 提交于 2020-03-01 16:46:42
首先我们来看一段代码: 1 <script> 2 console.log(a); 3 var a = 10; 4 </script> 此时运行结果为 为什么会显示undefined呢?这就涉及到了 预解析中的变量提升 : 1、 局部提升(变量) 会把变量声明分成两部分 1) 变量声明 只有这个部分发生了提升 ,提升至所在作用域的最前面 2) 变量赋值 在原位置; 接下来再看一段代码: 1 <script> 2 foo(); 3 function foo(){ 4 console.log("hello world"); 5 } 6 </script> 此时运行结果为: 我们会发现,声明式的函数,调用在声明之前也是可以访问的。这是因为 预解析总的函数提升 : 2 、整体提升(函数) 整个函数都提升到作用域的最前面 了解了变量提升和函数提升,那么我们来想一下两者谁的优先级更高? 1 <script> 2 console.log(foo); 3 var foo = 10; 4 function foo(){} 5 </script> 显示结果为: 结果得到函数而不是变量; 也就是说:函数将变量声明覆盖,说明是先变量提升之后,函数再提升上去将其覆盖。所以, 变量提升的优先级高。 总结 : JavaScript 预解析机制 有如下操作: 检查 你的所有代码有没有 语法错误 。如果有语法错误

DK1.5-JDK11各个新特性

◇◆丶佛笑我妖孽 提交于 2020-02-28 19:48:32
摘要: 参考文献: https://blog.csdn.net/lsxf_xin/article/details/79712537 JDK各个版本的新特性 要了解一门语言,最好的方式就是要能从基础的版本进行了解,升级的过程,以及升级的新特性,这样才能循序渐进的学好一门语言。以下介绍一下JDK1.5版本到JDK1.7版本的特性及JDK1.8部分特性。 JDK1.5新特性 1:自动装箱与拆箱: 自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中。 自动拆箱的过程:每当需要一个值时,被装箱对象中的值就被自动地提取出来,没必要再去调用intValue()和doubleValue()方法。 自动装箱,只需将该值赋给一个类型包装器引用,java会自动创建一个对象。 自动拆箱,只需将该对象值赋给一个基本类型即可。 java——类的包装器 类型包装器有:Double,Float,Long,Integer,Short,Character和Boolean 2:枚举 把集合里的对象元素一个一个提取出来。枚举类型使代码更具可读性,理解清晰,易于维护。枚举类型是强类型的,从而保证了系统安全性。而以类的静态字段实现的类似替代模型,不具有枚举的简单性和类型安全性。 简单的用法:JavaEnum简单的用法一般用于代表一组常用常量,可用来代表一类相同类型的常量值。 复杂用法

nginx的请求接收流程(二)

一世执手 提交于 2020-02-27 20:49:12
在ngx_http_process_request_line函数中,解析完请求行之后,如果请求行的uri里面包含了域名部分,则将其保持在请求结构的headers_in成员的server字段,headers_in用来保存所有请求头,它的类型为ngx_http_headers_in_t: [cpp] view plain copy <span style= "font-size: 18px; "> typedef struct { ngx_list_t headers; ngx_table_elt_t *host; ngx_table_elt_t *connection; ngx_table_elt_t *if_modified_since; ngx_table_elt_t *if_unmodified_since; ngx_table_elt_t *user_agent; ngx_table_elt_t *referer; ngx_table_elt_t *content_length; ngx_table_elt_t *content_type; ngx_table_elt_t *range; ngx_table_elt_t *if_range; ngx_table_elt_t *transfer_encoding; ngx_table_elt_t *expect; #if

extern \"C\" 用法解析

老子叫甜甜 提交于 2020-02-25 23:34:19
extern "c"用法解析 作者 作者Jason Ding ,链接 http://www.jianshu.com/p/5d2eeeb93590 引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。 extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。 比如说你用C 开发了一个DLL 库,为了能够让C ++语言也能够调用你的DLL输出(Export)的函数,你需要用extern "C"来强制编译器不要修改你的函数名。 揭秘extern "C" 从标准头文件说起 #ifndef __INCvxWorksh /*防止该头文件被重复引用*/ #define __INCvxWorksh #ifdef __cplusplus //__cplusplus是cpp中自定义的一个宏 extern "C" { //告诉编译器

hashcode(),equal()方法深入解析

让人想犯罪 __ 提交于 2020-02-25 11:05:43
首先,想要明白hashCode的作用,必须要先知道Java中的集合。   总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。 前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。 那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢? 这就是Object.equals方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。 也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。 于是,Java采用了哈希表的原理。哈希(Hash)实际上是个人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。 哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。 这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。 如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。

JavaScript 中的函数与作用域

自闭症网瘾萝莉.ら 提交于 2020-02-17 08:53:02
一、声明提升 大部分编程语言都是先声明变量再使用,但在 JavaScript 中,有些不一样: console . log ( username ) ; // undefined var username = 'JavaScript' ; 上面的代码会正常输出 undefined 而不是报错 Uncaught ReferenceError: a is not defined 。就是因为声明提升( declaration hoisting )。 那为什么输出的是 undefined 而不是 JavaScript 呢? 因为 JavaScript 只有变量的声明会提升,初始化不会。 再看段代码: a = 2 ; var a ; console . log ( a ) ; // 2 同样是因为变量提升的原因,所以输出的是 2 而不是 undefined 。 JavaScript 引擎会在解释 JavaScript 代码之前首先对其进行编译。编译阶段中的一部分工作就是找到所有的声明,并用合适的作用域将它们关联起来。因此,包括变量和函数(我们后面会再次提到)在内的所有声明都会在任何代码被执行前首先被处理。 JavaScript 在读到 var a = 2; 时,会将其看成两个声明: var a; 和 a = 2; 。第一个定义声明是在编译阶段进行的;第二个赋值声明会被留在原地等待执行阶段。

精读《V8 引擎 Lazy Parsing》

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-15 05:45:55
1. 引言 本周精读的文章是 V8 引擎 Lazy Parsing ,看看 V8 引擎为了优化性能,做了怎样的尝试吧! 这篇文章介绍的优化技术叫 preparser ,是通过跳过不必要函数编译的方式优化性能。 2. 概述 & 精读 解析 Js 发生在网页运行的关键路径上,因此加速对 JS 的解析,就可以加速网页运行效率。 然而并不是所有 Js 都需要在初始化时就被执行,因此也不需要在初始化时就解析所有的 Js!因为编译 Js 会带来三个成本问题: 编译不必要的代码会占用 CPU 资源。 在 GC 前会占用不必要的内存空间。 编译后的代码会缓存在磁盘,占用磁盘空间。 因此所有主流浏览器都实现了 Lazy Parsing(延迟解析),它会将不必要的函数进行预解析,也就是只解析出外部函数需要的内容,而全量解析在调用这个函数时才发生。 预解析的挑战 本来预解析也不难,因为只要判断一个函数是否会立即执行就可以了,只有立即执行的函数才需要被完全解析。 使得预解析变复杂的是变量分配问题。原文通过了堆栈调用的例子说明原因: Js 代码的执行在堆栈上完成,比如下面这个函数: function f(a, b) { const c = a + b; return c; } function g() { return f(1, 2); // The return instruction pointer

js代码预解析

为君一笑 提交于 2020-02-13 10:29:07
1、var一般用于声明变量,预解析代码的时候,等号后面的赋值过程不会执行,所以预解析时的var变量都是未定义的 2、function声明的函数,预解析的时候,值就是函数里面的内容 例:console.log(c)   var c = 1;   console.log(c)   function c( ){console.log(2)}   预解析过程:var c;       function c( ){console.log(2)};       console.log(c)  // function c( ){console.log(2)};       c = 1;       console.log(c)  // 1        来源: https://www.cnblogs.com/cuishuangshuang/p/12302385.html

深入理解JavaScript系列(14):作用域链(Scope Chain)

给你一囗甜甜゛ 提交于 2020-02-11 04:55:43
前言 在第12章关于变量对象的描述中,我们已经知道一个执行上下文 的数据(变量、函数声明和函数的形参)作为属性存储在变量对象中。 同时我们也知道变量对象在每次进入上下文时创建,并填入初始值,值的更新出现在代码执行阶段。 这一章专门讨论与执行上下文直接相关的更多细节,这次我们将提及一个议题——作用域链。 英文原文:http://dmitrysoshnikov.com/ecmascript/chapter-4-scope-chain/中文参考:http://www.denisdeng.com/?p=908本文绝大部分内容来自上述地址,仅做少许修改,感谢作者 定义 如果要简要的描述并展示其重点,那么作用域链大多数与内部函数相关。 我们知道,ECMAScript 允许创建内部函数,我们甚至能从父函数中返回这些函数。 var x = 10; function foo() { var y = 20; function bar() { alert(x + y); } return bar; } foo()(); // 30 这样,很明显每个上下文拥有自己的变量对象:对于全局上下文,它是全局对象自身;对于函数,它是活动对象。 作用域链正是内部上下文所有变量对象(包括父变量对象)的列表。此链用来变量查询。即在上面的例子中,“bar”上下文的作用域链包括AO(bar)、AO(foo)和VO