函数声明

预编译 AO

人盡茶涼 提交于 2019-12-22 02:16:28
js运行时会进行三件事: 1.语法分析 2.预编译 3.解释执行 语法分析会在代码执行前对代码进行通篇检查,以排除一些低级错误 预编译发生在代码执行的前一刻 解释执行就是执行代码 预编译的作用: 1、函数声明整体提前; 写出一个函数声明,不管写在哪里,系统总会将其提升到逻辑最前面。 2、变量声明提前 例如: document . write ( x ) ; //undefined var x = '你好' ; 相当于 var x ; //提前 document . write ( x ) ; //undefined x = '你好' ; 预编译前奏 1、任何变量,如果变量未经声明就赋值,此变量就为全局对象所有, 2、一切声明的全局变量,全是window的属性; 预编译四个步骤: 1、创建AO(activation object/执行期上下文)对象 2、找形参和变量声明,将变量和形参作为AO的属性名,值为undefined 3、将实参值和形参统一 4、在函数中找函数声明,值赋予函数体 根据预编译四个步骤逐步分析: function fun ( x ) { console . log ( x ) ; var x = 'beautiful' ; console . log ( x ) ; function x ( ) { } console . log ( x ) ; var y =

jsday4笔记

谁都会走 提交于 2019-12-22 01:20:53
函数 为什么要有函数 如果要在多个地方求1-100之间所有数的和,应该怎么做? 概念:当它被调用时执行的可重复使用的代码块。 什么是函数 函数的作用就是封装一段代码,将来可以重复使用。 就是函数,起个名字(函数名),在后续开发中可以反复调用 函数的定义 函数声明式 function 函数名 ( ) { // 函数体 } 函数表达式 var fn = function ( ) { // 函数体 } 特点: 函数声明的时候,函数体并不会执行,只要当函数被调用的时候才会执行。 函数一般都用来干一件事情,需用使用动词+名词,表示做一件事情 tellStory sayHello 等 函数的调用 调用函数的语法: 函数名 ( ) ; 特点: 函数体只有在调用的时候才会执行,调用需要()进行调用。 可以调用多次(重复使用) 代码示例: // 声明函数 function sayHi ( ) { console . log ( "吃了没?" ) ; } // 调用函数 sayHi ( ) ; // 求1-100之间所有数的和 function getSum ( ) { var sum = 0 ; for ( var i = 0 ; i < 100 ; i ++ ) { sum += i ; } console . log ( sum ) ; } // 调用 getSum ( ) ; 函数的参数

变量声明提升和函数声明提升

 ̄綄美尐妖づ 提交于 2019-12-22 00:47:08
/*--> */ /*--> */ 一道面试题被虐惨了 看了书看了资料整理的 不记得看了谁的文章了 这是整理后 有部分一样的不要打我// 变量声明提升 <!DOCTYPE html> <html> <head><script> var i = 20; function n(){ alert(i); }; n(); </script> </head> </html> //结果是20 <!DOCTYPE html> <html> <head><script> var i = 20; function n(){ alert(i); var i = 50; }; n(); </script> </head> </html> //结果是undefined ↑变量声明提升会把变量声明提前,但是变量初始化还在后面,如果在变量初始化前面输出,变量还未初始化,就会alert出undefined,这是变量声明提升。 函数声明提升 是在执行代码之前会读取函数声明。可以把函数声明放在调用他的语句后面。 函数声明是把一个函数值赋值给了变量,所以可以进行函数声明提前。函数表达式是一个表达式是把函数对象赋值给了变量,所以不能进行函数声明提前。 函数表达式和函数声明的区别: 函数声明格式 function(arg0,arg1,arg2){ //函数体 } 函数表达式格式 var functionName =

JS中的执行上下文(Execution Context)和栈(stack)

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-21 20:08:25
在这篇文章中,我将深入探讨 JavaScript 中一个最基本的部分,即 Execution Context 。 在本文结束时,您应该更清楚地知道解释器是怎么工作的,为什么某些函数/变量在声明之前就可以使用以及它们的值是如何确定的。 一:什么是执行上下文? 当JavaScript代码运行的时候,确定它运行所在的环境是非常重要的。运行环境由下面三种不同的代码类型确定 全局代码(Global Code):代码首次执行时候的默认环境 函数代码(Function Code):每当执行流程进入到一个函数体内部的时候 Eval代码(Eval Code):当eval函数内部的文本执行的时候 您可以在网上找到大量关于 scope 的参考资料。为了更易于理解,我们将 execution context 简单视为运行当前代码的 environment/scope 。好了,话不多说,先让我们看个例子,其中包含了 global context 和 function/local context 代码。 在上图中,我们有1个全局上下文( Global Context ),使用紫色边框表示;有3个不同的函数上下文( Function Context )由绿色,蓝色,和橙色边框表示。注意!全局上下文有且只有一个,程序中其他任意的上下文都可以访问全局上下文。 你可以拥有任意数量的函数上下文。每一次 函数调用

AO的预编译

与世无争的帅哥 提交于 2019-12-21 19:29:34
JS在页面加载过程中顺序执行。但是分块预编译、执行。 JS在执行前会进行类似”预编译”的操作,而且先预声明变量再预定义函数。 此时注意,是声明,不是定义,如:var a = 1; 在预编译中,只是执行了”var a”没有赋值,即在预编译结束时a 为undefined。 (注意)并不是先全文编译完在执行,而是块编译,即一个script块中,预编译再执行,然后(按顺序)下一个script块,预编译再执行,但此时上一个块中的数据都是可以用的,但下一个块中的函数,声明的变量都是不可用的。 变量没声明就引用,会报错,但对象方法,对象变量没声明,是undefined 在函数中变量不声明就赋值,会被认为是全局变量,用var声明后为函数变量 在执行函数时时也是先编译后执行,但要注意函数定义中(即大括号中)的代码即使有错只要函数不执行,就不会有影响,但一执行函数,开始函数预编译就会出错。 先说下预编译, 例如 function arr(){ function sum(){ var bit = 53; console.log(sun); 在sum函数里面没有sun,就在下面找,后台输出为36 } console.log(sun); sun的值在上面没有,但也不能往下找,只能是undefined var sun = 36; sum(); console.log(sun); sun的值在上面找,顺着下来

模板的声明和实现为何要放在头文件中?

人盡茶涼 提交于 2019-12-21 07:23:00
源: http://blog.csdn.net/lqk1985/archive/2008/10/24/3136364.aspx 如何组织编写模板程序 发表日期: 1/21/2003 12:28:58 PM 发表人: Nemanja Trifunovic 前言 常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂。 我在5年前开始使用模板,那时我看到了MFC的容器类。直到去年我还没有必要自己编写模板类。可是在我需要自己编写模板类时,我首先遇到的事实却是 “传统”编程方法(在*.h文件声明,在*.cpp文件中定义)不能用于模板。于是我花费一些时间来了解问题所在及其解决方法。 本文对象是那些熟悉模板但还没有很多编写模板经验的程序员。本文只涉及模板类,未涉及模板函数。但论述的原则对于二者是一样的。 问题的产生 通过下例来说明问题。例如在array.h文件中有模板类array: // array.h template <typename T, int SIZE> class array { T data_[SIZE]; array (const array& other); const array& operator =

第16章模板与泛型编程

一笑奈何 提交于 2019-12-21 03:36:21
一、函数模板 /*--> */ /*--> */ template <typename T1,typename T2> int function(const T1 & t1,const T2 &t2){} 尖括号内部的参数叫模板参数。 1.实例化函数模板 编译器用函数实参推断模板实参。这些编译器生成的版本被称为模板的实例。 2.模板类型参数 模板类型参数是可以用来表示返回类型或函数参数类型,以及在函数体内用于变量声明或类型转换的参数,如下程序所示。必须说明非类型模板参数并不是表示类型的参数,而是表示具体数值的参数,详见下文。 template <typename T> T foo(T *p) { T tmp=*p; return tmp; } 3.非类型模板参数 非类型模板参数表示一个值不是一个类型!!通过定义特定的类型名来指定参数,而不是typename或class。 非类型模板参数是一个常量值,在需要常量表达式的地方,可以使用非类型参数,比如数组的大小。 非类型模板参数的模板实参必须是常量表达式!! template <unsigned N,unsigned M> int compare(const char (&p1)[N],const char (&p2)[M]) { return strcmp(p1,p2); } 当调用compare("hi","mom")时

TS02 TypeScript基础

我怕爱的太早我们不能终老 提交于 2019-12-21 02:04:07
安装 全局安装TypeScript命令行工具 npm install -g typescript 安装后就可以在全局使用 tsc 命令,来编译TypeScript文件: tsc hello.ts TypeScript编写的文件后缀名是 .ts ,用TypeScript编写React应用时文件后缀名是 .tsx Hello TypeScript function sayHello(person: string) { return `hello, ${person}` } const user = 'Tom'; console.log(sayHello(user)); 在TS中,使用 : 指定变量的类型,编译后的代码: function sayHello(person) { return "hello, " + person; } var user = 'Tom'; console.log(sayHello(user)); TypeScript会对代码进行静态检查,如果传入的参数和我们指定的类型不匹配,IDE就可以给出即时的提示,并且在编译阶段会报错(但是并不会阻止编译的过程) 例如我们将上面的 user 的值改为数值 123 ,那么在IDE中会提示: 编译时也报错: src/hello.ts:5:22 - error TS2345: Argument of type '123' is

PL/SQL程序设计

陌路散爱 提交于 2019-12-20 22:53:51
第一章:PL/SQL概述: 什么是PL/SQL: A。PL/SQL是 Procedure Language & Structured Query Language 的缩写。PL/SQL是对SQL语言存储过程语言的扩展。从ORACLE6以后,ORACLE的RDBMS附带了PL/SQL。它现在已经成为一种过程处理语言,简称PL/SQL。目前的 PL/SQL包括两部分 ,一部分是数据库引擎部分;另一部分是可嵌入到许多产品(如C语言,JAVA语言等)工具中的独立引擎。可以将这两部分称为: 数据库PL/SQL和工具PL/SQL 。两者的编程非常相似。都具有编程结构、语法和逻辑机制。 B。PL /SQL是一种高级数据库程序设计语言,该语言 专门用于在各种环境下对ORACLE数据库进行访问 。由于该语言集成于数据库服务器中 ,所以PL/SQL代码可以对数据进行快速高效的处理。 PL/SQL的好处: A。有利于客户/服务器环境应用的运行 对于客户/服务器环境来说,真正的瓶颈是网络上。无论网络多快,只要客户端与服务器进行大量的数据交换。应用运行的效率自然就回受到影响。如果使用PL/SQL进行编程,将这种具有大量数据处理的应用放在服务器端来执行。自然就 省去了数据在网上的传输时间 。 B。适合于客户环境 PL/SQL由于分为数据库PL/SQL部分和工具PL/SQL。对于客户端来说,PL

C++中的类模板详细讲述

随声附和 提交于 2019-12-20 10:25:21
一、类模板定义及实例化 1 . 定义一个类模板: View Code 1 template<class 模板参数表>2 3 class 类名{4 5 // 类定义......6 7 }; 其中,template 是声明类模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个,可以是 类型参数 ,也可以是 非类型参数。 类型参数由关键字class或typename及其后面的标识符构成。非类型参数由一个普通参数构成,代表模板定义中的一个常量。 例: View Code 1 template<class type,int width>2 3 //type为类型参数,width为非类型参数4 5 class Graphics; 注意: (1) 如果在全局域中声明了与模板参数同名的变量,则该变量被隐藏掉。 (2) 模板参数名不能被当作类模板定义中类成员的名字。 (3) 同一个模板参数名在模板参数表中只能出现一次。 (4) 在不同的类模板或声明中,模板参数名可以被重复使用。 View Code 1 typedef string type; 2 3 template<class type,int width> 4 5 class Graphics 6 7 { 8 9 type node;//node不是string类型10 11 typedef double type;//错误