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打印网页部分内容的脚本
Nov 17 Javascript
使用SyntaxHighlighter实现HTML高亮显示代码的方法
Feb 04 Javascript
Ubuntu 11.10 安装Node.js的方法
Nov 30 Javascript
JS动态加载当前时间的方法
Feb 09 Javascript
JavaScript中常用的六种互动方法示例
Mar 13 Javascript
多个jQuery版本共存的处理方案
Mar 17 Javascript
JavaScript实现拖拽网页内元素的方法
Apr 15 Javascript
JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)
Sep 23 Javascript
JS中图片压缩的方法小结
Nov 14 Javascript
mint-ui 时间插件使用及获取选择值的方法
Feb 09 Javascript
使用Vue组件实现一个简单弹窗效果
Apr 23 Javascript
webpack的CSS加载器的使用
Sep 11 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
PHP 常见郁闷问题答解
2006/11/25 PHP
php获取服务器信息的实现代码
2013/02/04 PHP
PHP文件锁函数flock()详细介绍
2014/11/18 PHP
Laravel修改验证提示信息为中文的示例
2019/10/23 PHP
script标签的 charset 属性使用说明
2010/12/04 Javascript
jquery做的一个简单的屏幕锁定提示框
2014/03/26 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
JavaScript 七大技巧(一)
2015/12/13 Javascript
数据结构中的各种排序方法小结(JS实现)
2016/07/23 Javascript
jQuery可见性过滤选择器用法示例
2016/09/09 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
如何解决vue与传统jquery插件冲突
2017/03/20 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
JS实现倒计时图文效果
2018/11/17 Javascript
Angular value与ngValue区别详解
2019/11/27 Javascript
解决vue的router组件component在import时不能使用变量问题
2020/07/26 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
[13:21]DOTA2国际邀请赛采访专栏:RSnake战队国士无双,Fnatic.Fly
2013/08/06 DOTA
[03:55]显微镜下的DOTA2特别篇——430灰烬之灵神级操作
2014/06/24 DOTA
Python抓取框架 Scrapy的架构
2016/08/12 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
Python输入二维数组方法
2018/04/13 Python
编写多线程Python服务器 最适合基础
2018/09/14 Python
python opencv判断图像是否为空的实例
2019/01/26 Python
pybind11和numpy进行交互的方法
2019/07/04 Python
Python 旋转打印各种矩形的方法
2019/07/09 Python
python基础教程之while循环
2019/08/14 Python
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
Baby Tulai澳大利亚:美国婴儿背带品牌
2018/10/15 全球购物
历史学专业推荐信
2013/11/06 职场文书
化学教师自荐信范文
2013/12/28 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
合作协议书范本
2014/04/17 职场文书
工程材料采购方案
2014/05/18 职场文书
2015年秘书个人工作总结
2015/04/25 职场文书
Python3 多线程(连接池)操作MySQL插入数据
2021/06/09 Python