JavaScript变量声明详解


Posted in Javascript onNovember 27, 2014

定义在函数体外的都属于全局变量,定义在函数体内的属于局部变量。这里的定义是指通过var声明的。

JavaScript有隐含的全局概念,意味着你不声明的任何变量都会成为一个全局对象属性。例如:

function test(){

    myname = "huming";

    alert(myname);

}

test();// "huming"

alert(myname);
//"huming"

 两个结果是一样的,说明myname是一个全局变量。

那么,隐式全局变量和明确定义的全局变量有没有区别呢。。答案肯定是有的,看下面的例子:

// 定义三个全局变量

var global_test1 = 1;

global_test2 = 2; // 反面教材

(function () {

    global_test3 = 3; // 反面教材

}());

// 试图删除

delete global_test1; // false

delete global_test2; // true

delete global_test3; // true

// 测试该删除

alert(typeof global_test1); // "number"

alert(typeof global_test2); // "undefined"

alert(typeof global_test3); // "undefined"

 由上面的例子可以看出:在函数之外通过var定义的global_test1不能被删除,而没有经过var定义的global_test2和global_test3都被删除了(无论是否是在函数体内创建)。

总结来说,在函数体外通过var声明的全局变量不能被删除,而隐式全局变量是可以删除的。

这里要注意了:JavaScript有一种行为叫做“hoisting”(悬置/置顶解析/预解析)。

我们通过一个例子来说明:

var myname = "huming"; //声明全局变量

function test() {

    alert(myname);

    var myname = "local_huming";

    alert(myname);

}

test();

 你猜两次alert的内容一致吗??显然不一致,一致还用说吗。。实际输出是:"undefined", "local_huming"。

上面的例子等同于

var myname = "huming"; //声明全局变量

function test() {
var myname;

alert(maname);<br>
myname = "local_huming";

alert(myname);    // "local"

}

test();

第一次alert输出的myname并不是你以为的全局变量,而是和它在一个作用域(一个函数体)内的局部变量。虽然它还没有被声明,但被当作是声明了。这就是所谓的“hoisting”。

这样应该就明白了吧。当你在函数体中使用了一个变量,又在之后重新声明的话,就可能产生错误。

书写规范:

function test() {

   var a = 1,

       b = 2,

       c = a + b,

       d = {},

       e,

       f;

   // function body...

}

 

好处在于:

1、所有局部变量都定义在函数开始,方便查找;

2、防止变量在定义之前使用的逻辑错误。

小伙伴们是否了解了javascript的变量声明了呢,以上内容很详细也很易懂,最后的总结也很中肯,小伙伴们不要错过。

Javascript 相关文章推荐
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
Feb 27 Javascript
js实现类似jquery里animate动画效果的方法
Apr 10 Javascript
jquery获取easyui日期控件的值实现方法
Nov 09 Javascript
详解Javascript数据类型的转换规则
Dec 12 Javascript
JS+html5制作简单音乐播放器
Sep 13 Javascript
基于 Bootstrap Datetimepicker 联动
Aug 03 Javascript
微信小程序中button组件的边框设置的实例详解
Sep 27 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
Aug 31 Javascript
使用post方法实现json往返传输数据的方法
Mar 30 Javascript
详解element-ui表格中勾选checkbox,高亮当前行
Sep 02 Javascript
javascript中闭包closure的深入讲解
Mar 03 Javascript
JavaScript高级程序设计之基本引用类型
Nov 17 Javascript
js脚本实现数据去重
Nov 27 #Javascript
实例分析js和C#中使用正则表达式匹配a标签
Nov 26 #Javascript
javascript几个易错点记录
Nov 26 #Javascript
jquery选择器需要注意的问题
Nov 26 #Javascript
jquery操作对象数组元素方法详解
Nov 26 #Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
Nov 26 #Javascript
JavaScript定义类和对象的方法
Nov 26 #Javascript
You might like
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
PHP语法小结之基础和变量
2015/11/22 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
javascript修改IMG标签的src问题
2014/03/28 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
2017/02/09 Javascript
javascript实现数据双向绑定的三种方式小结
2017/03/09 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
javaScript实现复选框全选反选事件详解
2020/11/20 Javascript
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
vue计算属性时v-for处理数组时遇到的一个bug问题
2018/01/21 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
2018/06/29 Javascript
如何基于vue-cli3.0构建功能完善的移动端架子
2019/04/24 Javascript
ajax跨域访问遇到的问题及解决方案
2019/05/23 Javascript
[01:00:14]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第三场
2018/04/10 DOTA
python实现dnspod自动更新dns解析的方法
2014/02/14 Python
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
Pandas:DataFrame对象的基础操作方法
2018/06/07 Python
解决Python pandas plot输出图形中显示中文乱码问题
2018/12/12 Python
Django model反向关联名称的方法
2018/12/15 Python
Python基础知识点 初识Python.md
2019/05/14 Python
Python3实现定时任务的四种方式
2019/06/03 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
2019/10/17 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
html5 viewport使用方法示例详解
2013/12/02 HTML / CSS
THE OUTNET美国官网:国际设计师品牌折扣网站
2017/03/07 全球购物
社区庆中秋节活动方案
2014/02/07 职场文书
yy生日主持词
2014/03/20 职场文书
奥巴马开学演讲稿
2014/05/15 职场文书
建设工程授权委托书
2014/09/22 职场文书
2015年管理人员工作总结
2015/05/13 职场文书
房屋维修申请报告
2015/05/18 职场文书
Python简易开发之制作计算器
2022/04/28 Python