解析函数

预解析

醉酒当歌 提交于 2020-03-08 04:48:01
预解析 JS代码在执行之前,会对代码进行预解析,寻找作用域中的var 和function ,然后对其进行事先声明,在从上到下执行代码。这就是一个预解析的过程。 预解析机制 js代码只执行前,会把函数或者变量声明提升所在作用域的最顶端 注意点:只是声明提前(变量声明和函数声明),变量的赋值和函数的调用留在原地 依次执行 全局作用域 GO对象:全局对象 a 生成一个GO对象,封装的就是作用域 GO={} b 分析变量声明(var) 就是声明的变量名作为Go对象的属性名 值为undefinde c 分析函数声明 函数名作为Go对象的属性名,属性值为函数体,如果有遇到同名函数,直接覆盖 console . log ( a ) ; var a = 12 ; function a ( ) { var a ; var a = function ( ) { } } /* 1生成一个GO对象:GO={} 2分析变量声明 GO={a:undefined} 3分析函数声明 GO={a:function a() { var a; var a = function() { } }} */ AO对象(活动对象) AO的步骤 在函数执行前的一瞬间, 1生成一个AO对象 2. 分析参数 ,以形参作为该对象的属性名,实参作为属性值 3. 分析变量声明(var声明的变量) 变量名为属性名 ,值为undefined

JS面向对象之作用域

折月煮酒 提交于 2020-03-08 02:24:15
作用域 词法作用域 作用域 域 表示的就是 范围 ,即 作用范围 就是一个名字在什么地方能使用,在什么地方不能使用 块级作用域 块 级别的作用范围 // 在 c , java 等编程语言中,下面的语法报错 { var num = 123; // 应该用int , 这里是伪代码 { console.log(num); // 123 } console.log(num); // 报错 } 在 js 中采取词法作用域 词法(代码) 作用域,就是代码在编写过程中体现出来的作用范围,代码一旦写好,不用执行,他的作用范围就已经确定好了,这个就是所谓的 词法作用域 在 js 中的词法作用域规则 1. 函数允许方位函数外的数据 2. 整个代码结构中只有函数可以限定作用域 3. 作用规则首先是 提升规则 分析 4. 就近原则 如果当前作用规则有了名字,就不考虑外面的名字 在 js 中作用域分析方法 1. 先进行预解析,分析预解析过程 * 程序在执行过程, 会先将代码读取到内存中检查. 会将所有的声明在此时进行标记. 所谓的标记就是 让 js 解释器知道有这个名字, 后面在使用名字的时候, 不会出现未定义的错误. 这个标记过程就是提升. * 声明 1. 名字的声明, 标识符的声明( 变量名声明 ) * 名字的声明就是让我们的解释器知道有这个名字 * 名字没有任何数据与之对应 2. 函数的声明 *

rpc:call/4函数解析

☆樱花仙子☆ 提交于 2020-03-07 20:08:11
最近听说erlang的rpc跟其他语言的rpc模式不是很相同,所以就开始学习rpc模块的方法,以下是rpc:call/4函数的一些解析。 rpc:call/4函数体: call(N,M,F,A) when node() =:= N -> %% Optimize local call local_call(M, F, A); call(N,M,F,A) -> do_call(N, {call,M,F,A,group_leader()}, infinity). 这里会判断是否是在当前节点内运行。如果是的话,我们接着往下看: local_call(M, F, A) when is_atom(M), is_atom(F), is_list(A) -> case catch apply(M, F, A) of {'EXIT',_}=V -> {badrpc, V}; Other -> Other end. 则直接调用apply方法,得到结果。 如果不是当前节点: do_call(Node, Request, infinity) -> rpc_check(catch gen_server:call({?NAME,Node}, Request, infinity)); do_call(Node, Request, Timeout) -> Tag = make_ref(), {Receiver

函数解析

对着背影说爱祢 提交于 2020-03-07 07:01:20
1.为什么要用函数 a)函数能够增加程序的可读性 b)提高开发的效率 c)可以重复使用和在各种适用情况下使用 void swap(int *a,int *b) { int t; t=a; a=b; b=t; } 这段代码适用于任何想要交换数字的时候,节省了时间。 2.为什么要用函数重载 a)解决了命名冲突问题,增加了可读性. b)减少了用户的复杂性 void a(); void a(int); void a(float,float); void a(constchar*,constchar*); void Max(int,int); intmain() { a(2.4); return; } 函数重载可以优先选出想要应用的函数 3.什么是值传递 a)值传递是指只将要使用的值传入函数,而不改变值本身.就是指将一个实参传递给一个形参. #include<stdio.h> void change(int num) { num=0; //修改参数 } int main() { int a=1; change(a); //调用函数 printf("%d",a);//输出变量,变量的值没改变 return 0; } 4.什么是地址传递 a)地址传递是指将实参的地址传给函数,可以在函数里面改变实参的值 #include<stdio.h> void change(int *num) { num=0

Linux USB 鼠标驱动程序解析

大憨熊 提交于 2020-03-07 04:41:21
USB 总线引出两个重要的链表!   一个 USB 总线引出两个重要的链表,一个为 USB 设备链表,一个为 USB 驱动链表。设备链表包含各种系统中的 USB 设备以及这些设备的所有接口,驱动链表包含 USB 设备驱动程序(usb device driver)和 USB 驱动程序(usb driver)。   USB 设备驱动程序(usb device driver)和 USB 驱动程序(usb driver)的区别是什么?   USB 设备驱动程序包含 USB 设备的一些通用特性,将与所有 USB 设备相匹配。在 USB core 定义了:struct usb_device_driver usb_generic_driver。usb_generic_driver 是 USB 子系统中唯一的一个设备驱动程序对象。而 USB 驱动程序则是与接口相匹配,接口是一个完成特定功能的端点的集合。   设备是如何添加到设备链表上去的?   在设备插入 USB 控制器之后,USB core 即会将设备在系统中注册,添加到 USB 设备链表上去。   USB 设备驱动程序(usb device driver)是如何添加到驱动链表上去的?   在系统启动注册 USB core 时,USB 设备驱动程序即将被注册,也就添加到驱动链表上去了。   接口是如何添加到设备链表上去的?   在 USB

Winsock解析

左心房为你撑大大i 提交于 2020-03-06 04:33:33
一、基本知识 1、 Winsock,一种标准API ,一种网络 编程 接口,用于两个或多个应用程序(或进程)之间通过网络进行数据通信。具有两个版本: Winsock 1: Windows CE平台支持。 头文件:WinSock.h 库:wsock32.lib Winsock 2: 部分平台如Windows CE貌似不支持。通过前缀WSA可以区别于Winsock 1版本。个别函数如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都属于Winsock 1.1规范的函数; 头文件:WinSock2.h 库:ws2_32.lib mswsock.h用于编程扩展,使用时必须链接mswsock.dll。 2、网络协议: IP (Internet Protocol) 网际协议,无连接协议; TCP (Transmission Control Protocol) 传输控制协议; UDP (User Datagram Protocol) 用户数据协议; FTP (File Transfer Protocol) 文件传输协议; HTTP (Hypertext Transfer Protocol) 超文本传输协议; 3、字节存储顺序: big_endian:大端存储,存储顺序从高位到低位,地址指向最高有效字节。在网络中将IP和端口指定为多字节时使用大端存储

select函数详细用法解析

你离开我真会死。 提交于 2020-03-05 06:59:59
1.表头文件 #include #include #include 2.函数原型 int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout); 3.函数说明 select()用来等待文件描述词状态的改变。参数n代表最大的文件描述词加1,参数readfds、writefds和exceptfds 称为描述词组,是用来回传该描述词的读,写或例外的状况。底下的宏提供了处理这三种描述词组的方式: FD_CLR(inr fd,fd_set* set);用来清除描述词组set中相关fd的位 FD_ISSET(int fd,fd_set *set);用来测试描述词组set中相关fd的位是否为真 FD_SET(int fd,fd_set*set);用来设置描述词组set中相关fd的位 FD_ZERO(fd_set *set);用来清除描述词组set的全部位 4.结构体说明 先说明两个结构体: 1) struct fd_set可以理解为一个集合,这个集合中存放的是文件描述符(filedescriptor),即文件句柄,这可以是我们所说的普通意义的文件,当然Unix下任何设备、管道、FIFO等都是文件形式,全部包括在内,所以毫无疑问一个socket就是一个文件

Solr系列五:solr搜索详解(solr搜索流程介绍、查询语法及解析器详解)

空扰寡人 提交于 2020-03-04 19:00:42
一、solr搜索流程介绍 1. 前面我们已经学习过Lucene搜索的流程,让我们再来回顾一下 流程说明: 首先获取用户输入的查询串,使用查询解析器QueryParser解析查询串生成查询对象Query,使用所有搜索器IndexSearcher执行查询对象Query得到TopDocs,遍历TopDocs得到文档Document 2. Solr搜索的工作流程: 流程说明: 用户输入查询字符串,根据用户的请求类型qt(查询为/select)选择请求处理器RequestHandler,根据用户输入的参数defType来选择一个查询解析器解析用户的查询串(默认使用RequestHander中配置的默认查询解析器),查询解析器解析完以后根据用户输入的参数qf指定的字段进行搜索(默认是所有索引字段),查询到结果以后做一些特殊的处理(fq,sort,start,rows,wt)以后使用响应处理器ResponseWriter返回给用户 3. 查看内核的solrconfig.xml文件,了解搜索的请求处理器配置 <requestHandler name="/select" class="solr.SearchHandler"> <lst name="defaults"> <str name="echoParams">explicit</str> <int name="rows">10</int>

Linux环境下C语言getopt函数的详细解析

别等时光非礼了梦想. 提交于 2020-03-03 07:11:40
该函数在头文件 getopt.h 中。 函数原型: int getopt ( int argc , char * const argv [ ] , const char * optstring ) ; 返回值为int类型,其实解析成功一个选项时(可能这时看不懂,没关系,后面会解释)这个返回的就是一个字符,因为字符可以转为整数。 若解析完毕,则返回-1。 前两个参数大家都知道,就是main函数的参数选项: argc 是参数个数, argv 是参数的字符串数组(不要忘记 argv[0] 是"./可执行文件名")。而第三个参数就是 选项字符串 。 什么是 选项字符串 ? 选项 大家都知道,比如: gcc -o test test.c gcc -v 上面的 -o 、 -v 就是选项,其中 -o 是带参数的选项,其参数为 test ,而 -v 是不带参数的选项。 那么说了这么多, 选项字符串其实就是一定格式的字符串,它决定了传给程序的参数 argv中 可以有哪些选项,而这些选项中哪些可以有参数。然后运行程序时, getopt 函数对 argv 进行解析,依次返回成功解析的选项,解析完毕后返回-1。 举个例子:选项字符串给定:“ab:c::”,那么说明运行程序可以给最多三个参数,分别为 -a , -b 和 -c , 其中 -a ,因为 没有后跟冒号 是不可以有参数的; -b ,因为

30s源码刨析系列之函数篇

别来无恙 提交于 2020-03-01 21:42:10
前言 由浅入深、逐个击破 30SecondsOfCode 中函数系列所有源码片段,带你领略源码之美。 本系列是对名库 30SecondsOfCode 的深入刨析。 本篇是其中的函数篇,可以在极短的时间内培养你的函数式思维。 内容根据源码的难易等级进行排版,目录如下: 新手级 普通级 专家级 正文 新手级 checkProp const checkProp = (predicate, prop) => obj => !!predicate(obj[prop]); const lengthIs4 = checkProp(l => l === 4, 'length'); lengthIs4([]); // false lengthIs4([1, 2, 3, 4]); // true lengthIs4(new Set([1, 2, 3, 4])); // false (Set uses Size, not length) const session = { user: {} }; const validUserSession = checkProp(u => u.active && !u.disabled, 'user'); validUserSession(session); // false session.user.active = true; validUserSession