`
秦瑶123
  • 浏览: 14939 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

提升,隐含全局变量与全局变量

 
阅读更多

 

提升

javascript允许在函数任意地方声明多个变量,无论在哪里声明,这就是所谓的“提升”。当先使用变量再在函数后面声明变量时可能会导。对javascript而言,只要变量是在同一个范围(同一个函数)里,就视为已经声明,哪怕是在变量声明前就使用。

//反模式
myname="global";//全局变量
function func(){
alert(myname);//"未定义"
var myname="local";
alert(myname);//"局部变量"
}
func();

 

这个例子中,可能以为第一个alert()会提示为“全局变量”,第二个为“局部变量”,这是一个合乎情理的期望,因为在第一个alert中,myname没有声明,因此函数可能“看到“全局变量myname。但事实并不是这样,第一个alert会被指名为“未定义”,因为myname被看做声明为函数的本地变量(尽管是在后面声明)。所有的变量声明都提升到函数的最顶层。因此,为了避免这类混乱,最好在开始就声明要用的所有变量。

前面的代码片段运行结果和以下代码一样。

因为在第一个alert中,myname没有声明,因此函数可能“看到“全局变量myname。但事实并不是这样,第一个alert会被指名为“未定义”,因为myname被看做声明为函数的本地变量(尽管是在后面声明)。所有的变量声明都提升到函数的最顶层。因此,为了避免这类混乱,最好在开始就声明要用的所有变量。

前面的代码片段运行结果和以下代码一样。

myname=global;//全局变量
function func(){
var myname;// 等同于ver myname=undefined;‘
alert(mynam);//"未定义"
myname=local;
alert(myname);//"局部
func()”

 

 

注意:为了完整起见,再谈谈实现级别上的事情,事实上它们更为复杂,代码处理上分为两个阶段,第一,这是一个阶段创建变量,函数声明及形式参数。这是解析和进入上,下文的阶段。第二个阶段是代码运行时执行过程,创建函数表达和不合格的标识符(未定义变量)。但为了实际使用的目的,我们采纳了“提升”的概念,这个概念没有在ECMASript标准中定义,但经常用来表述这种情形。

 

隐含全局变量与全局变量

隐含全局变量与明确定义的全局变量有细微的不同,不同之处在于能否使用delect操作符撤销变量。

使用var创建的全局变量(这类变量在函数外部创建)不能被删除。

不使用var创建的隐含全局变量(尽管它是在函数内部创建)可以删除。

表示隐含全局变量不是真正的变量,而是全局变量的属性。属性可以通过delect操作符删除,但变量不可以。

//定义三个全局变量
var global_var=1;
global_novar=2;//反模式
(function(){
global_fromfunc=3;//反模式
}());
//企图删除
delect global_var;//false
delect global_novar;//true
delect global_fromfunc;//true
//测试删除情况
typeof golobal_var;//"number"类型

typeof global_novar;//"undefined"类型

typeof global_fromfunc;/"undefined"类型

 参考资料:《JavaScript模式》

分享到:
评论

相关推荐

    JavaScript变量声明详解

    定义在函数体外的都属于全局变量,定义在函数体内的属于局部变量。这里的定义是指通过var声明的。 JavaScript有隐含的全局概念,意味着你不声明的任何变量都会成为一个全局对象属性。例如: 代码如下: function ...

    深入理解javascript学习笔记(一) 编写高质量代码

    第二,JavaScript有隐含的全局概念,意味着你不声明的任何变量都会成为一个全局对象属性(不是真正意义上的全局变量,可以用delete删除) 代码如下: function sum(x,y) { // result 未声明,为隐式全局变量 result =...

    浅析JavaScript声明变量

    使用var关键词声明变量的作用域是当前的执行上下文,有可能是外围函数,或者,当变量声明在函数体之外时,则为全局变量。 定义在函数体外的都属于全局变量,定义在函数体内的属于局部变量。这里的定义是指通过var...

    C++中四种对象生存期和作用域以及static的用法总结分析

    已初始化的全局变量或静态全局对象存储于.data段中 未初始化的全局变量或静态全局对象存储于.bss段中 静态局部对象 已初始化的静态局部变量存储于.data段中 未初始化的静态局部变量存储于.bss段中 代码如下:#include...

    C语言程序设计标准教程

    在主函数中输入n值,并作为实参,在调用时传送给s 函数的形参量n( 注意,本例的形参变量和实参变量的标识符都为n, 但这是两个不同的量,各自的作用域不同)。 在主函数中用printf 语句输出一次n值,这个n值是实参n的...

    bron::man_running: 适用于 Node.js 的快速而小巧的测试运行器

    没有魔法,没有隐含的全局变量,没有单独的进程,没有依赖关系 使用 Node.js模块,或自带(例如 、 ) 并行(默认)或串行运行测试 超时(默认:15 秒) 需要 Node.js v12.20+ 作为纯 ES 模块编写/发布 为什么?...

    slickgrid-es6:为ES6重写SlickGrid fork以在npm和Babel Rollup构建下使用

    新增功能可以在此处的create-react-app中查看它的运行情况: : 主要目标是: 在现代ES2016代码库中轻松使用向下移植到ES5 保留两个网格的现有SlickGrid API 使依赖项消耗隐含而不依赖于全局变量消除对Slick....

    宋劲彬的嵌入式C语言一站式编程

    4. 全局变量、局部变量和作用域 4. 分支语句 1. if语句 2. if/else语句 3. 布尔代数 4. switch语句 5. 深入理解函数 1. return语句 2. 增量式开发 3. 递归 6. 循环语句 1. while语句 2. do/while语句 3. for语句 4. ...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    和行为应为与变量和方法相对应。自行车的状态:数度是 10mp(每小时 10 米),步度是 90rpm (每分钟 90 转),当前传动装置是第 5 个齿轮。再面向对象的程序设计中,这些数据应放在 变量中。自行车的行为:刹车,...

    VBScript 语言参考

    Nothing 使对象变量与所有实际的对象没有任何关联。 Null 表示变量含有无效的数据。 Number 属性 返回或设置代表某个错误的数值。 Oct 函数 返回表示一数的八进制值的字符串。 On Error 语句 启用错误处理。 ...

    VBScript 语言参考中文手册CHM

    Nothing 使对象变量与所有实际的对象没有任何关联。 Null 表示变量含有无效的数据。 Number 属性 返回或设置代表某个错误的数值。 Oct 函数 返回表示一数的八进制值的字符串。 On Error 语句 启用错误处理。 ...

    VBSCRIP5 -ASP用法详解

    Nothing 使对象变量与所有实际的对象没有任何关联。 Null 表示变量含有无效的数据。 Number 属性 返回或设置代表某个错误的数值。 Oct 函数 返回表示一数的八进制值的字符串。 On Error 语句 启用错误处理。 ...

    javascript学习笔记.docx

    写未声明的变量会是JavaScript环境自动产生一个全局变量。 2) 对于完全等同“===”,两个null或者两个undefined是等同的;但null与undefined是不等同的。 3) 对于相等“==”, null与undefined是相等的。若值与对象...

    C++编程规范101条规则、准则与最佳实践PDF.rar

    第10条 尽量减少全局和共享数据 19 第11条 隐藏信息 20 第12条 懂得何时和如何进行并发性编程 21 第13条 确保资源为对象所拥有。使用显式的RAII和智能指针 24 编程风格 27 第14条 宁要编译时和连接...

    C# 程序设计手册(WORD)

    在查询表达式中使用隐含型别局部变量和数组 191 扩充方法 192 实作和呼叫自定义扩充方法 197 建立列举型别的新方法 199 建构函式 200 使用建构函式 201 实例建构函式 204 私用建构函式 209 静态建构函式 211 撰写...

    疯狂内核之——内核初始化

    2.1.5 隐含规则 17 2.1.6 定义模式规则 19 2.1 KBuild体系 23 2.1.1 内核目标 24 2.1.2 主机程序 26 2.1.3 编译标志 27 2.2 内核编译分析 28 2.2.1 编译配置 29 2.2.2 寻找第一个目标 32 2.2.3 prepare和scripts目标...

    大数据实验报告总结体会-大数据挖掘流程及方法总结.pdf

    遗传算法 遗传算法是⼀种基于⽣物⾃然选择与遗传机理的随机搜索算法,是⼀种仿⽣全局优化⽅法。遗传算法具有的隐含并⾏性、易于和其它模型结 合等性质使得它在数据挖掘中被加以应⽤。 决策树⽅法 决策树是⼀种常⽤...

    光学薄膜自动设计的多目标优化方法

    该算法隐含并行处理能力,原理上是具备全局搜索能力的自适应随机性算法。将此算法运用到光学薄膜设计中,给出了一些优化的设计实例。结果表明,将多目标优化算法引入薄膜设计的新思路是可行的,将来会有较好的发展前景。

    8086/8088汇编语言程序设计教程

    8.2.3 存储模型说明伪指令的隐含动作 8.3 模块间的通信 8.3.1 伪指令PUBLIC和伪指令EXTRN 8.3.2 模块间的转移 8.3.3 模块间的信息传递 8.4 子程序库 8.4.1 子程序库 8.4.2 建立子程序库 8.4.3 使用举例 8.5 编写供...

    80x86汇编语言程序设计教程

    8.2.3 存储模型说明伪指令的隐含动作 8.3 模块间的通信 8.3.1 伪指令PUBLIC和伪指令EXTRN 8.3.2 模块间的转移 8.3.3 模块间的信息传递 8.4 子程序库 8.4.1 子程序库 8.4.2 建立子程序库 8.4.3 使用举例 8.5 编写供...

Global site tag (gtag.js) - Google Analytics