今天看到大神写得一片文章,自己对全局变量和局部变量的理解还是不够深刻,因此写到这篇文章,做个总结。

大神代码截图+理解文字如下:

解析:上面代码中,变量i是var命令声明的,在全局范围内都有效,所以全局只有一个变量i。每一次循环,变量i的值都会发生改变,而循环内被赋给数组a的函数内部的console.log(i),里面的i指向的就是全局的i。也就是说,所有数组a的成员里面的i,指向的都是同一个i,导致运行时输出的是最后一轮的i的值,也就是10。

一、定义

局部变量:变量在函数内声明,只能在函数内部访问。

全局变量:变量在函数外定义,整个代码都可以调用的变量。

声明关键字:var。 JavaScript中可以隐士的使用变量,不用声明变量直接使用。JavaScript中把隐士声明的变量总是当成全局变量来使用的。

二、变量提升(这个知识点如果不了解,那么就容易坑)

由于JS引擎的工作方式,是先获取所有被声明的变量在逐一执行,所以变量的声明语句都会被提升到当前代码块的头部。

注:代码块/方法块===>指的是Function的一对大括号{ }, 切忌,是Function块,而for、while、if、块并不是作用域的划分标准。

三、进一步了解

代码提升的效果所以实际执行的代码是这样的:

<script type="text/javascript">
var a = 1;
function test1() {
var a; //i未赋值【当局部变量与全局变量重名时,局部变量优先级高于全局变量,所以会覆盖全局变量,此时的a只有声明却未定义】
alert(a);//所以执行alert值为undefined
a = 2;
alert(a);
}
test1();
alert(a);//undefined 2
</script>

四、例子

JavaScript的变量的scope是根据方法块来划分的(也就是说Function的一对大括号{ }来划分)。在这里再次强调一遍:是Function块,而for、while、if 块并不是作用域的划分标准。其变量不会被提升。

js中作用域只有函数作用域和全局作用域,当不在函数里那就是全局作用域了。【参考地址:http://www.cnblogs.com/zhus/p/6513741.html】

<script type="text/javascript">
function test2() {
alert("before for scope:" + i); //i未赋值【并不是未声明!使用未声明的变量或函数全抛出致命错误而中断脚本执行】 for (var i = 0; i < 3; i++) {
alert("in for scope:" + i); // i的值是 0、1、2, 当i为3时跳出循环
}
alert("after for scope:" + i); // i的值是3,注意,此时已经在for scope以外,但i的值仍然保留为3 while (true) {
var j = 1;
break;
}
alert(j); // j的值是1,注意,此时已经在while scope以外,但j的值仍然保留为1 if (true) {
var k = 1;
}
alert(k); //k的值是1,注意,此时已经在if scope以外,但k的值仍然保留为1
}
test2();
//若在此时(function scope之外)再输出只存在于test2 这个function scope里的 i、j、k变量会发生神马效果呢?
alert(i); //error! 没错,是error,原因是变量i未声明(并不是未赋值,区分test2函数的第一行输出),导致脚本错误,程序到此结束!
alert("这行打印还会输出吗?"); //未执行
alert(j); //未执行
alert(k); //未执行
</script>

参考资料:http://blog.csdn.net/zyz511919766/article/details/7276089

JavaScript中全局变量和局部变量的不同的更多相关文章

  1. js中全局变量和局部变量以及变量声明提升

    javascript中全局变量和局部变量的区别 转载前端小99 发布于2018-04-23 15:31:35 阅读数 2102  收藏 展开 [javascript] view plain copy ...

  2. python中全局变量和局部变量的一个小坑

    python 中全局变量和局部变量在使用过程中的一个容易出错的地方 什么是全局变量 python中,在函数外部声明的变量可以叫做全局变量. x = 10 def fn1(): pass fn1() 什 ...

  3. ajax实现给JavaScript中全局变量赋值(转)

    原文地址:ajax实现给JavaScript中全局变量赋值 问题简化: <script type="text/javascript"> var a=1 ; functi ...

  4. PHP和JS中全局变量和局部变量

    一,PHP中全局变量和局部变量 php与C++中对全局变量和局部变量定义类似,全局变量:函数外定义的变量,在全局通用:局部变量:在函数内定义的变量,只在函数内有效.PHP中变量范围跨越了include ...

  5. JavaScript 声明全局变量和局部变量

    JS中声明全局变量主要分为显式声明或者隐式声明下面分别介绍. 声明方式一: 使用var(关键字)+变量名(标识符)的方式在function外部声明,即为全局变量,否则在function声明的是局部变量 ...

  6. JavaScript 声明全局变量与局部变量

    一.JavaScript 声明全局变量的三种方式: 声明方式一: 使用var(关键字)+变量名(标识符)的方式在function外部声明,即为全局变量,否则在function声明的是局部变量.该方式即 ...

  7. JavaScript的全局变量与局部变量解析

    一.JavaScript scope 的划分标准是function函数块,不是以 if.while.for来划分的 <script> function f1(){ alert(" ...

  8. Javascript之全局变量和局部变量部分讲解

    以此文作为自己学习的一个总结. 关于全局变量和局部变量的一句简单的定义:在函数外声明的变量都为全局变量,在函数内声明的为局部变量. 一.局部变量和全局变量重名会覆盖全局变量 var a = 1; fu ...

  9. C语言中全局变量、局部变量、静态全局变量、静态局部变量的区别 (转)

    1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域. 从作用域看: 1>全局变量具有全局 ...

随机推荐

  1. SSM框架和SSH框架的区别

    SSH和SSM定义 SSH 通常指的是 Struts2 做控制器(controller),spring 管理各层的组件,hibernate 负责持久化层. SSM 则指的是 SpringMVC 做控制 ...

  2. sql 生成随机字符串

    生成三位随机字母+12位数字 ),), @c int; select @CardCode=abs(CHECKSUM(NEWID())) -LEN(@CardCode); ,@c)) set @Card ...

  3. 2017-2018_OCR_papers汇总

    2017-2018_OCR_papers 1. 简单背景 基于深度的OCR方法的发展历程 近年来OCR发展热点与趋势 检测方法按照主题进行分类 2. ECCV + CVPR + ICCV +AAAI ...

  4. PureMVC 官方文档翻译(一)

    最近在学习PureMVC框架,感觉最权威的还是阅读官方文档,顺便翻译了下全当记笔记了. PureMVC概览 这篇文档他讨论PureMVC框架的类和接口,使用UML来阐述它们的角色.职责和协作. Pur ...

  5. activeMQ (一)

    1.安装activeMQ,直接解压,启动2.访问localhost:8161/admin/ 用户名密码都是admin 3.点对点消息传递域,每个消息只能一个消费者,消息的生产者与消费者之间没有 时间上 ...

  6. [NOIP2015普及组]求和

    题目 题目描述 一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n.每个格子上都染了一种颜色color_i用[1,m]当中的一个整数表示),并且写了一个数字numberi. 定义一种特殊的三元组: ...

  7. rpm包与 yum 安装与卸载

    rpm包的安装:      1.安装一个包 # rpm -ivh 2.升级一个包 # rpm -Uvh 3.移走一个包 # rpm -e 4.安装参数 --force 即使覆盖属于其它包的文件也强迫安 ...

  8. java0425 wen IO

  9. 快速安装 Laravel 5.7

    $ git clone https://github.com/laravel/laravel.git $ cd laravel $ cp .env.example .env $ composer in ...

  10. Raphael.js--基础1

    Raphael.js 特点: 1.兼容VML和SVG 2.扩展功能——动画 用法: //1.创建画布 let paper=Raphael(x,y,width,height); //2.创建形状 let ...