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 相关文章推荐
麦鸡的TAB切换功能结合了javascript和css
Dec 17 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
Nov 14 Javascript
javascript中的delete使用详解
Apr 11 Javascript
javascript 函数及作用域总结介绍
Nov 12 Javascript
自己使用js/jquery写的一个定制对话框控件
May 02 Javascript
jQuery插件slides实现无缝轮播图特效
Apr 17 Javascript
特殊日期提示功能的实现方法
Jun 16 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
Jul 22 Javascript
Vue报错:Uncaught TypeError: Cannot assign to read only property’exports‘ of object’#‘的解决方法
Jun 17 Javascript
JavaScript实现数值自动增加动画
Dec 28 Javascript
使用elementUI实现将图片上传到本地的示例
Sep 04 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
Sep 27 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
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
IE iframe的onload方法分析小结
2010/01/07 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
javascript内存管理详细解析
2013/11/11 Javascript
js实现进度条的方法
2015/02/13 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
2015/08/25 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
Javascript获取图片原始宽度和高度的方法详解
2016/09/20 Javascript
通过原生JS实现为元素添加事件的方法
2016/11/23 Javascript
JS制作类似选项卡切换的年历
2016/12/03 Javascript
ES6概念 ymbol.for()方法
2016/12/25 Javascript
基于js文件加载优化(详解)
2018/01/03 Javascript
微信小程序自定义扫码功能界面的实现代码
2020/07/02 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
使用Python编写类UNIX系统的命令行工具的教程
2015/04/15 Python
python关闭windows进程的方法
2015/04/18 Python
python爬虫headers设置后无效的解决方法
2017/10/21 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
pytorch中的卷积和池化计算方式详解
2020/01/03 Python
matlab 计算灰度图像的一阶矩,二阶矩,三阶矩实例
2020/04/22 Python
Django Model中字段(field)的各种选项说明
2020/05/19 Python
Python datetime 如何处理时区信息
2020/09/02 Python
Python爬虫自动化爬取b站实时弹幕实例方法
2021/01/26 Python
全球最大最受欢迎的旅游社区:Tripadvisor
2017/11/03 全球购物
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
房地产销售大学生自我评价分享
2013/11/11 职场文书
外企财务年会演讲稿
2014/01/03 职场文书
学雷锋标兵事迹材料
2014/08/18 职场文书
表扬信范文
2015/05/04 职场文书
党小组评议意见
2015/06/02 职场文书
军训后的感想
2015/08/07 职场文书
python文件与路径操作神器 pathlib
2022/04/01 Python