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 相关文章推荐
动态加载iframe
Jun 16 Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
Mar 02 Javascript
网站页面自动跳转实现方法PHP、JSP(上)
Aug 01 Javascript
js相册效果代码(点击创建即可)
Apr 16 Javascript
JS替换文本域内的回车示例
Feb 18 Javascript
angular中使用路由和$location切换视图
Jan 23 Javascript
JS截取与分割字符串常用技巧总结
Nov 10 Javascript
JavaScript必知必会(七)js对象继承
Jun 08 Javascript
前端开发之CSS原理详解
Mar 11 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
Feb 26 Javascript
jQuery实现的回车触发按钮事件功能示例
Mar 25 jQuery
解决vue+webpack项目接口跨域出现的问题
Aug 10 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
Snoopy类使用小例子
2008/04/15 PHP
PHP 中文乱码解决办法总结分析
2009/07/30 PHP
解析用PHP实现var_export的详细介绍
2013/06/20 PHP
PHP中如何实现常用邮箱的基本判断
2014/01/07 PHP
php调用mysql存储过程实例分析
2014/12/29 PHP
AngularJS实现全选反选功能
2015/12/08 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
Angular的事件和表单详解
2016/12/26 Javascript
webpack打包js的方法
2018/03/12 Javascript
LayerClose弹窗关闭刷新方法
2018/08/17 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
vue搜索和vue模糊搜索代码实例
2019/05/07 Javascript
微信小程序封装自定义弹窗的实现代码
2019/05/08 Javascript
js如何验证密码强度
2020/03/18 Javascript
用Python代码来绘制彭罗斯点阵的教程
2015/04/03 Python
Python多线程编程(四):使用Lock互斥锁
2015/04/05 Python
python简单文本处理的方法
2015/07/10 Python
python中 logging的使用详解
2017/10/25 Python
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
python中copy()与deepcopy()的区别小结
2018/08/03 Python
python如何实现不用装饰器实现登陆器小程序
2019/12/14 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
使用python实现下载我们想听的歌曲,速度超快
2020/07/09 Python
使用Python操作MySQL的小技巧
2020/09/10 Python
简单介绍HTML5中的文件导入
2015/05/08 HTML / CSS
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
医学生自我评价
2014/01/27 职场文书
在校大学生个人的自我评价
2014/02/13 职场文书
聚美优品的广告词
2014/03/14 职场文书
刊首寄语大全
2014/04/11 职场文书
中华美德颂演讲稿
2014/05/20 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
2014年物业公司工作总结
2014/11/22 职场文书
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫
Linux中文件的基本属性介绍
2022/06/01 Servers