预编译

js预编译

人走茶凉 提交于 2020-02-12 08:14:01
我们都知道js执行遵循两个规则 1.函数声明整体提升 2.变量 声明提升 其实还有一点最重要的就是预编译,预编译往往发生在函数执行前,了解预编译,对我们理解函数执行非常关键。 预编译的前奏 1.imply global暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局属性所有。 2.一切声明的全局变量,全是window的属性。 下面就先看几个例子吧 例1 function fn(a){   console.log(a);   var a = 123; console.log(a);   function a(){};   console.log(a);   var b = function(){};//这是函数表达式,不是函数声明(var b属于变量声明)   console.log(b);   function d(){} } fn(1); 1.创建AO对象 AO{ } 2.查找函数形参及函数内变量声明,形参名及变量名作为AO对象的属性,值为undefined AO{   a:undefined;   b : undefined; } 3. 实参形参相统一,实参值赋给形参 (即把实参的值赋给形参,并不执行函数内的赋值) AO{   a:1;   b : undefined; } 4. 查找函数声明,函数名作为AO对象的属性,值为函数体 AO{    a

JS 预编译

强颜欢笑 提交于 2020-02-11 01:07:00
第一步: 语法分析 第二步: 预编译 第三步: 解释执行   1. 语义分析     语义分析是通篇执行的一个过程。不如有一篇代码,在执行时是解析一行执行一行,但在执行之前系统执行的第一步它会扫描一遍,看看有没有低级的语法错误,比如少些个符号,带个特殊字符之类的。此时通扫一遍,但是不执行,这个通篇扫面的过程叫语义分析,通篇扫面后就会预编译,然后解释一行执行一行,也就是解释执行。   2. 预编译      1. imply global :暗示全局变量:即任何变量,如果变量未经声名就赋值,自变量就为全局对象所有 a = 10; // 这种应该就是 imply global 了 console.log(a); // 打印 10 window.a; // 10 说明 window 属性上有 a var b = 20; // 声名了 b, 此时 window 也有了 b     2. 一切声名的全局变量,全是 window 的属性     3. 函数声名提升:如果写了一个函数声名,无论写在哪里,浏览器都会把这个函数提到逻辑的最前面。 函数声名整体提升      4. 变量 声名提升 所以系统只提升变量,而不是变量带着值一起提 var a = 123; // 上面的变量声名分为两步 var a; // 第一步,声名变量 a = 123; // 第二步, 变量赋值 console.log(a

JS预编译

白昼怎懂夜的黑 提交于 2020-02-10 23:10:19
JS预编译 js运行三部曲 语法分析 预编译 解释执行 ** 预编译 ** 预编译发生在函数执行前的一刻。 简单现象:函数声明整体提升, 变量 声明提升(定义赋值不提升) ** 预编译过程(四部曲):** 1.创建AO对象(Activated Object)(执行期上下文) 2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined。 3.将实参值和形参统一。 4.在函数体里面找函数声明,值赋予函数体。 function fn(a){ console.log(a); var a =123; console.log(a); function a(){}; console.log(a); var b = function(){}; console.log(b); function d(){}; } fn(1); //解析 一、预编译过程: 1.创建AO对象,找形参和变量声明,将变量和形参名作为AO属性名,值设置为undefined。 AO{ a:undefined, b:undefined, } 2.形参和实参统一 AO{ a:1, b:undefined, } 3.找函数声明,值赋予函数体 AO{ a:function a(){}, b:undefined, d:function d(){}; } 二、执行过程 1.第一个console.log(a):function

VS2013使用rtklib中需要注意的一些问题(编译)

做~自己de王妃 提交于 2020-02-10 11:54:53
VS2013使用rtklib中需要注意的一些问题(编译) 最近因为项目需要需要对rtcm数据进行解码,rtklib提供了很多底层的函数,准备直接输出标准DLL的方式供C#调用。下面把项目中引用rtklib源码需要注意的地方记录下。 1. 首先在vs2013中新建一个win32的dll项目,将rtk源码放到工程路径下(注意不是工程组所在路径),命名为rtklibsrc 2. 在项目上添加一个文件夹[rtklibsrc]然后在文件夹上【添加现有项目】把rtklib的源文件(rtklibsrc下文件)加入工程。在rtklibsrc下建立rcv把(rtklibsrc\rcv)下面的文件也添加到工程 3. 现在开始编译工程,你会发现很多错误。下面我们一步步来解决错误。 1> Q: error C1853: “Debug\rtklibHelper.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反) x:\xxxx\rtklibhelper\rtklibsrc\tle.c 1 1 rtklibHelper A: 不使用预编译头 2> Q: 错误 1 error C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To

生成可执行程序的四个步骤——预处理,编译,汇编,链接

瘦欲@ 提交于 2020-02-04 15:14:57
导读 相信大家对下列这段代码都不陌生 a.c #include<stdio.h> int main() { printf("Hello World!\n"); return 0; } 在Linux中,当我们使用gcc来编译这个程序时,只需使用最简单的命令 gcc -o a a.c 实际上,上述过程可以分解为 4个步骤,分别是预处理(又可以被称为预编译),编译,汇编,链接 。 用命令来体现就是如下四个步骤: 预处理 gcc -E a.c -o a.i 编译 gcc -s a.i -o a.s 汇编 gcc -c a.s -o a.o 链接 gcc a.o -o a//gcc -o a a.o 一.预编译 预编译过程主要处理那些源代码文件中的以“#”开始的预编译指令,比如“#include”,“#define”等,主要处理规则如下: 将所有的“#define”删除,并且展开所有的宏定义。 处理所有条件预编译指令,比如“#if”,“#ifdef”,“#elif”,“#else”,“#endif”。 处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。注意,这个过程是递归进行的,也就是说被包含的文件可能还包含其他文件。 删除所有的注释“//”和“/**/”。 添加行号和文件名标识,比如#2“a.c”2

unity 利用扩展编辑器添加摆放好的游戏物体

孤街醉人 提交于 2020-02-01 01:16:36
添加扩展编辑器 将代码放在Editor文件夹下,这个文件夹下的所有脚本在场景运行前会先被预编译,而且不会被打包进去。 编辑器脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class SpawnManager : EditorWindow { [MenuItem( "Tools/Click Me!" )] // 创建菜单 Tools/Click Me! static void PatternSystem() { GameObject spawnManager = GameObject.Find( "PatternManager" ); if (spawnManager != null ) { var patternManager = spawnManager.GetComponent<PatternManager>(); if (Selection.gameObjects.Length == 1) // 如果当前鼠标只点击了 1 个游戏物体 { var item = Selection.gameObjects[0].transform.Find( "Item" ); // 获取当前点击的游戏物体的 item 子节点

预编译

你。 提交于 2020-01-31 03:59:36
预编译的四部(在其中执行过的运行时不执行) 创建AO对象 找形参合和变量声明,将变量和形参名作为AO对象,值为undefined 将形参和实参统一 在函数体里面找函数声明,值赋予函数体(将函数名作为AO对象的属性名写进AO对象) function fn ( a ) { console . log ( a ) ; //答案1 var a = 123 ; console . log ( a ) ; //答案2 function a ( ) { } ; //函数声明 console . log ( a ) ; //答案3 var b = function ( ) { } ; //函数表达式 console . log ( b ) ; //答案4 function d ( ) { } //函数声明 } fn ( 1 ) ; 第一步 AO{} 第二部 AO{ a:undefined //变量声明+形参 b:undefined //变量声明 } 第三部 AO{ a:1*//实参传值* b:undefined; } 第四步 AO{ a:function a(){}; b:function b(){}; d:function d(){} } 所以答案: 答案1:function a(){} 答案2:123 答案3:123 答案4:function (){} 例二(有全局变量) function

Openresty 预编译安装教程

ぃ、小莉子 提交于 2020-01-31 02:50:19
openresty将nginx+lua进行了整合,由国人开发。 官网: http://openresty.org/cn/ 预编译安装 以CentOS举例 其他系统参照: http://openresty.org/cn/linux-packages.html 你可以在你的 CentOS 系统中添加 openresty 仓库,这样就可以便于未来安装或更新我们的软件包(通过 yum update 命令)。运行下面的命令就可以添加我们的仓库: yum install yum-utils yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo 然后就可以像下面这样安装软件包,比如 openresty: yum install openresty 如果你想安装命令行工具 resty,那么可以像下面这样安装 openresty-resty 包: sudo yum install openresty-resty openresty目录结构 来源: CSDN 作者: 学亮编程手记 链接: https://blog.csdn.net/a772304419/article/details/104114738

第八章-预编译处理

折月煮酒 提交于 2020-01-23 10:53:32
/* * @Issue: 输入两个整数,求他们相除的余数,用带参的宏编程来实现 * @Author: 一届书生 * @LastEditTime : 2020-01-23 09:55:37 */ #include<iostream> #include<math.h> using namespace std; // 宏编程 // 求两个整数相除的余数 #define MOD(a,b) a%b // 交换两个元素 #define swap(x,y) {int t;t=x;x=y;y=t;} // 判断是否是字母 #define ISALPHA(c) ((c>='A'&&c<'Z')||(c>'a'&&c<'z')?1:0) // 判断整数n能否被x整除 #define DIV(n,x) ((n%x)==0?1:0) // 计算三角形面积 #define S(a,b,c) ((a+b+c)/2) #define AREA(a,b,c) sqrt(S(a,b,c)*(S(a,b,c)-a)*(S(a,b,c)-b)*(S(a,b,c)-c)) int main(){ int a,b; cout<<"请输入两个整数a,b:"<<endl; cin>>a>>b; cout<<MOD(a,b)<<endl; cout<<"a:"<<a<<endl<<"b:"<<b<<endl; swap(a,b)

几个预编译指令的用法

余生长醉 提交于 2020-01-18 21:38:35
转载: 痴 狼 While there is life there is hope http://www.cnblogs.com/Bolin/archive/2011/02/20/1959120.html 几个预编译指令的用法 预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。 在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。 预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是部分预处理指令: 指令 用途 # 空指令,无任何效果 #include 包含一个源代码文件 #define 定义宏 #undef 取消已定义的宏 #if 如果给定条件为真,则编译下面代码 #ifdef 如果宏已经定义,则编译下面代码 #ifndef 如果宏没有定义