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中的变量是传值还是传址的?
Apr 19 Javascript
JavaScript中yield实用简洁实现方式
Jun 12 Javascript
在浏览器窗口上添加遮罩层的方法
Nov 12 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
Aug 05 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
Jul 26 Javascript
JS克隆,属性,数组,对象,函数实例分析
Nov 26 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
Feb 20 Javascript
js删除数组中某几项的方法总结
Jan 16 Javascript
jquery实现垂直手风琴导航栏
Feb 18 jQuery
微信小程序利用for循环解决内容变更问题
Mar 05 Javascript
详解elementUI中input框无法输入的问题
Apr 27 Javascript
vue实践---根据不同环境,自动转换请求的url地址操作
Sep 21 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程序中防止盗链
2008/04/09 PHP
php对数组排序的简单实例
2013/12/25 PHP
ThinkPHP使用心得分享-分页类Page的用法
2014/05/15 PHP
微信支付开发订单查询实例
2016/07/12 PHP
thinkphp跨库操作的简单代码实例
2016/09/22 PHP
html下载本地
2006/06/19 Javascript
JS 强制设为首页的代码
2009/01/31 Javascript
什么是JavaScript
2009/08/13 Javascript
JS解析json数据并将json字符串转化为数组的实现方法
2012/12/25 Javascript
javascript数组去重方法终极总结
2014/06/05 Javascript
node.js中的url.resolve方法使用说明
2014/12/10 Javascript
js实现对table动态添加、删除和更新的方法
2015/02/10 Javascript
javascript实现无缝上下滚动特效
2015/12/16 Javascript
基于jQuery实现返回顶部实例代码
2016/01/01 Javascript
Bootstrap禁用响应式布局的实现方法
2017/03/09 Javascript
详解vue-element Tree树形控件填坑路
2019/03/26 Javascript
jQuery操作选中select下拉框的值代码实例
2020/02/07 jQuery
微信小程序录音实现功能并上传(使用node解析接收)
2020/02/26 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
python调用机器喇叭发出蜂鸣声(Beep)的方法
2015/03/23 Python
Python进度条实时显示处理进度的示例代码
2018/01/30 Python
python八皇后问题的解决方法
2018/09/27 Python
Django forms组件的使用教程
2018/10/08 Python
python使用多线程编写tcp客户端程序
2019/09/02 Python
django框架forms组件用法实例详解
2019/12/10 Python
巴西葡萄酒销售网站:Wine.com.br
2017/11/07 全球购物
俄罗斯运动鞋商店:Sneakerhead
2018/05/10 全球购物
《维生素c的故事》教学反思
2014/02/18 职场文书
企业法人授权委托书
2014/04/03 职场文书
安全生产演讲稿
2014/05/09 职场文书
超市优秀员工获奖感言
2014/08/15 职场文书
团党委领导干部党的群众路线教育实践活动个人对照检查材料思想汇
2014/10/05 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
创业计划书之美容店
2019/09/16 职场文书
pytorch 6 batch_train 批训练操作
2021/05/28 Python