javascript中局部变量和全局变量的区别详解


Posted in Javascript onFebruary 27, 2015

javascript有两种变量:局部变量和全局变量。当然,我们这篇文章是帮助大家真正的区别这两种变量。

首先,局部变量是指只能在本变量声明的函数内部调用。全局变量时整个代码中都可以调用的变量。当然,单单从字面上理解肯定是不清楚的,下面我详细的介绍下:
大家都知道,变量是需要用var关键字声明的。但是javascript中也可以隐式的使用变量,就是不用声明,直接使用。而且,千万注意,javascript把隐式声明的变量总是当成全局变量来使用的。
例如:

function myName() {

 i = 'yuanjianhang';

}

myName();

function sayName() {

 alert(i);

}

sayName();

输出结果为:yuanjianhang

这说明变量i就是一个全局的变量,如果把上面的代码改成如下:

function myName() {

 var i='yuanjianhang';

}

myName();

function sayName() {

 alert(i);

}

sayName();

此时,游览器将没有任何输出结果,因为i 是在函数myName中定义的,所以它只是myName的局部变量,不可能被外部调用。
 
现在再回过头来看下面的代码:

function myName() {

 i = 'yuanjianhang';

}

myName();

function sayName() {

 alert(i);

}

sayName();

现在,我们进行一下改动,把myName();去掉,代码如下:

function myName() {

 i = 'yuanjianhang';

}

function sayName() {

 alert(i);

}

sayName();

 此时,游览器也不会有如何反应。因为虽然i是全局变量,但是函数myName()并没有被调用,所以就相当于虽然声明了i,但是并没有给i赋予任何的值,所以没有任何输出。
同理,如果把上例改成:
 

function myName() {

 

 i = 'yuanjianhang';

}

function sayName() {

 alert(i);

}

sayName();

myName();

这种情况下还是不会输出任何结果,javascript代码的执行时从上到下的,在sayName()函数被调用时会检查变量i的值,此时函数myName尚未执行,也就是说i还没有被赋值,所以不会输出任何结果。
 
为了方便大家更好的理解,这里再举一个例子:

var i = 'yuanjianhang';

function myloveName() {

 i = 'guanxi';

}

myloveName();

function myName() {

 alert(i);

}

myName();

这次的结果是什么呢?
答案是guanxi
首先,i的原始值是yuanjianhang,但是当调用myloveName()函数之后,将i的值改为guanxi,所以最后的输出结果是guanxi。

如果将代码改为:

var i = 'yuanjianhang';

function myloveName() {

 var i = 'guanxi';

}

myloveName();

function myName() {

 alert(i);

}

myName();

此时的结果就是yuanjianhang了,因为代码中的两个i不一样,一个是全局的,一个是局部的,也可以这样理解,虽然两个i的名字一样,但是这两个i的本质却不一样,好像有两个名字一样的人一样,虽然名字一样,但却不是同一个人。

如果将代码改造成这样:

var i = 'yuanjianhang';

function myloveName() {

 i = 'guanxi';

}

function myName() {

 alert(i);

}

myName();

myloveName();

相信大家可以自己算出结果了,结果是yuanjianhang。

既然函数内部可以调用全局变量,那么下面这种情况呢:

var i = 'yuanjianhang';

function myloveName() {

  i = 'guanxi';

 alert(i);

}

myloveName();

此时变量的值是哪个呢?

我们来分析下:

首先全局变量i被赋值为:yuanjianhang。

接下来myloveName()函数被调用,全局变量i被重新赋予新的值:guanxi

所以结果肯定是:guanxi。

如果我们把alert提前呢,像这样:

var i = 'yuanjianhang';

function myloveName() {

  alert(i);

 i = 'guanxi';

}

myloveName();

这时候结果是什么呢?
经过验证结果是:undefined
如果代码是这样呢:

var i = 'yuanjianhang';

function myloveName() {

  alert(i);

}

myloveName();

此时i的结果是:yuanjianhang

为什么会发生上面undefined情况,因为代码的执行顺序是从上到下的,在输出i之前并没有对i定义。所以从这里可以看出,使用代码的时候,变量的声明一定要放到代码的前面,以避免出现类似的问题!

同理:

var i = 'yuanjianhang';

function myloveName() {

 alert(i);

 var i = 'guanxi';

 

}

myloveName();

这种情况下也会输出:undefined

好了,关于变量我只有这么多的介绍了,相信这些任何人都可以看明白。不管代码如何复制,其核心是不会变的。

以上就是本文的全部内容了,小伙伴们对于javascript中局部变量和全局变量的区别是否有了更深刻的认识了呢,祝大家新年快乐~学习愉快。

Javascript 相关文章推荐
javascript 对象的定义方法
Jan 10 Javascript
JQuery的一些小应用收集
Mar 27 Javascript
js如何调用qq互联api实现第三方登录
Mar 28 Javascript
JS实现的一个简单的Autocomplete自动完成例子
Apr 16 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
Aug 24 Javascript
Javascript缓存API
Jun 14 Javascript
总结十个Angular.js由浅入深的面试问题
Aug 26 Javascript
微信小程序 底部导航栏目开发资料
Dec 05 Javascript
js实现一键复制功能
Mar 16 Javascript
详解React 的几种条件渲染以及选择
Oct 23 Javascript
JavaScript常用内置对象用法分析
Jul 09 Javascript
js获取url页面id,也就是最后的数字文件名
Sep 25 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
Feb 27 #Javascript
JavaScript中Function详解
Feb 27 #Javascript
JS实现图片产生波纹一样flash效果的方法
Feb 27 #Javascript
js实现鼠标触发图片抖动效果的方法
Feb 27 #Javascript
javascript实现当前页导航激活的方法
Feb 27 #Javascript
jquery 根据name名获取元素的value值
Feb 27 #Javascript
jQuery使用元素属性attr赋值详解
Feb 27 #Javascript
You might like
在任意字符集下正常显示网页的方法一
2007/04/01 PHP
解读PHP中的垃圾回收机制
2015/08/10 PHP
Zend Framework教程之Zend_Config_Xml用法分析
2016/03/23 PHP
Zend Framework教程之Zend_Config_Ini用法分析
2016/03/23 PHP
Sample script that deletes a SQL Server database
2007/06/16 Javascript
理解Javascript_01_理解内存分配原理分析
2010/10/11 Javascript
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
jquery自定义类似$.ajax()的方法实现代码
2013/08/13 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
详解JavaScript的回调函数
2015/11/20 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
ES6概念 Symbol.keyFor()方法
2016/12/25 Javascript
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
2017/11/17 Javascript
详解React开发必不可少的eslint配置
2018/02/05 Javascript
利用d3.js实现蜂巢图表带动画效果
2019/09/03 Javascript
vue实现pdf文档在线预览功能
2019/11/26 Javascript
python基础教程之面向对象的一些概念
2014/08/29 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
Python2和Python3的共存和切换使用
2019/04/12 Python
python Pandas库基础分析之时间序列的处理详解
2019/07/13 Python
给大家整理了19个pythonic的编程习惯(小结)
2019/09/25 Python
如何使用repr调试python程序
2020/02/28 Python
智能电子应届生求职信
2013/11/10 职场文书
优秀求职自荐信怎样写
2013/12/18 职场文书
十佳大学生事迹材料
2014/01/29 职场文书
岗位聘任书范文
2014/03/29 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
三八妇女节演讲稿
2014/05/27 职场文书
财务负责人岗位职责
2015/02/03 职场文书
学校国庆节活动总结
2015/03/23 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
一篇文章带你深入了解Mysql触发器
2021/08/02 MySQL
GTX1660显卡搭配显示器推荐
2022/04/19 数码科技