JAVASCRIPT函数作用域和提前声明 分享


Posted in Javascript onAugust 22, 2013

一些语言如C、java都有块级作用域,即花括号内的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的,但是javascript没有块级作用域。javascript使用函数作用域,即变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的,也即函数内声明的所有变量在函数体内始终是可见的。这样就意味着变量在声明之前就可以使用,这个特性被称为"声明提前",即javascript函数里声明的所有变量都被提前至函数的顶部。来看个例子。

var test1 = "globalVariable";

function test(){


console.log(test1);



var test1 = "localVariable";


console.log(test1);

}

上述函数执行的结果是:先输出"undefined",再输出"localVariable"。
很多人都会误以为结果是:先输出"globalVariable,再输出localVariable"。其实不然,由于函数作用域的特性,局部变量在整个函数体始终是有定义的,也即,在函数体内局部变量遮盖了同名全局变量,但是只有在程序执行到var语句的时候,局部变量才会被真正的赋值。因此,上述过程相当于,将函数内的变量声明提前至函数体顶部,同时变量初始化留在原来的位置。就相当于如下这个函数
var test1 = "globalVariable";

function test(){


var test1;
//将函数内的变量声明提前至函数顶部


console.log(test1);



test1 = "localVariable";
//赋值


console.log(test1);

}

但是,如果函数内没有用var声明变量,情况又有所不同。
var test1 = "globalVariable";

function test(){


console.log(test1);



test1 = "localVariable";



console.log(test1);


}

这个函数执行的结果是:先输出"globalVariable",再输出"localVariable"。
由于函数体内的test1变量没有用var声明,就默认为全局变量,当然就不存在变量提前声明的问题。第一行就会输出"globalVariable",而第三行改变了test1全局变量的值,输出了"localVariable"。
Javascript 相关文章推荐
javascript实现des解密加密全过程
Apr 03 Javascript
JS获取随机数函数可自定义最小值最大值
May 08 Javascript
jQuery实现简单的日期输入格式化控件
Mar 12 Javascript
javascript中的Base64、UTF8编码与解码详解
Mar 18 Javascript
JavaScript实现模仿桌面窗口的方法
Jul 18 Javascript
js图片轮播特效代码分享
Sep 07 Javascript
js 实现省市区三级联动菜单效果
Feb 20 Javascript
使用jquery+iframe做一个ajax上传效果(实例)
Aug 24 jQuery
浅谈react前后端同构渲染
Sep 20 Javascript
axios取消请求的实践记录分享
Sep 26 Javascript
微信小程序使用template标签实现五星评分功能
Nov 03 Javascript
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
Jun 17 Javascript
JavaScript中的eval()函数详解
Aug 22 #Javascript
from 表单提交返回值用post或者是get方法实现
Aug 21 #Javascript
jquery重新播放css动画所遇问题解决
Aug 21 #Javascript
JS性能优化笔记搜索整理
Aug 21 #Javascript
JS检测图片大小的实例
Aug 21 #Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
Aug 21 #Javascript
JavaScript 中的日期和时间及表示标准介绍
Aug 21 #Javascript
You might like
PHP向浏览器输出内容的4个函数总结
2014/11/17 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
zShowBox 图片放大展示jquery版 兼容性
2011/09/24 Javascript
javascript 循环调用示例介绍
2013/11/20 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
Angular+Bootstrap+Spring Boot实现分页功能实例代码
2017/07/21 Javascript
js中document.write和document.writeln的区别
2018/03/11 Javascript
浅谈开发eslint规则
2018/10/01 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
[01:32]TI奖金增速竟因它再创新高!DOTA2勇士令状不朽珍藏Ⅰ饰品欣赏
2018/05/18 DOTA
[31:55]完美世界DOTA2联赛循环赛 IO vs GXR BO2第一场 11.04
2020/11/05 DOTA
Python 开发Activex组件方法
2009/11/08 Python
c++生成dll使用python调用dll的方法
2014/01/20 Python
python3编写C/S网络程序实例教程
2014/08/25 Python
Python的Django中将文件上传至七牛云存储的代码分享
2016/06/03 Python
python如何获取服务器硬件信息
2017/05/11 Python
Python语言描述KNN算法与Kd树
2017/12/13 Python
python3实现基于用户的协同过滤
2018/05/31 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
Python实现的连接mssql数据库操作示例
2018/08/17 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
2019/02/12 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
python Jupyter运行时间实例过程解析
2019/12/13 Python
使用Python构造hive insert语句说明
2020/06/06 Python
Python  word实现读取及导出代码解析
2020/07/09 Python
python实现跨年表白神器--你值得拥有
2021/01/04 Python
美国娱乐和流行文化商品店:FYE
2017/09/14 全球购物
Discard Protocol抛弃协议的作用是什么
2015/10/10 面试题
前台接待的工作职责
2013/11/21 职场文书
老师对学生的评语
2014/04/18 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书
Python 如何实现文件自动去重
2021/06/02 Python
生命的关键成分来自太空?陨石说是的
2022/04/29 数码科技