一个JavaScript变量声明的知识点


Posted in Javascript onOctober 28, 2013

上周四吃完午饭,leader发了一道JavaScript的题目给我们做,我们Team里面有做前端的,有做后台的,也有坐mobile web的,所以大家对题目的理解各自都不一样,然后在QQ讨论组里面进行讨论。发现虽然很基础,但是通过讨论收获不少,分享出来。当然在有开发经验的开发者看来,这些都是学习JavaScript最基础的东西。因为平时都是用jQuery或者第三JS组件,所以对JavaScript基础学习不够重视。题目如下,问题是:2次alert分别输出什么结果?

<script
type="text/javascript">
    var a = 1;
    var a;
    alert(typeof a);
    (function () {
        b = '-----';
        var b;        
    })();
    alert( typeof b);
</script>

我的答案是:1.undefined 2.undefined。然后leader让我们再仔细考虑一下问题答案。我对题目的分析:
1.声明a并赋值为1,然后用重新声明a,但是此时没有赋值,那变量默认值应该为undefined。
2.b变量是在函数里面是局部变量,alert里面输出的是全局变量b,所以为undefiend。
我自己在Chrome里面运行了一下代码,代码正确结果是1.number 2.undefined。这里考察的是JavaScript的变量声明提前概念。
我们在看另外一个例子,比如下面:
test();
function test(){
    alert("Hello World!");
}

程序不会报错,而已运行结果是:Hello World!。原理:计算机在开始执行语句之前,会先查找所有的function定义,然后保存相关的function。
第1题:
var a = 1;
var a;
第2行声明变量a,就相当于在顶部声明了a,然后第一句是重新声明a,然后赋值为1。所以typeof a为number
第2题:
b = '-----';
var b;
第二题解析:b=‘-----',程序首先会去查找上下文是否有变量b的声明,如果有的话,直接赋值为'-----'。但是alert( typeof b); 是在函数外面,输出的全局变量b,所有是undefined。
请注意:对变量的赋值操作并没有提前。
接着看如下代码段:
<script type="text/javascript">
name="aaa";
function test(){
    alert(typeof name);    var name="bbb";
    alert(typeof name);
}
test();
</script>

请写出结果。
分析可以写成如下代码段:
name="aaa";
function test(){
    alert(typeof name);//在函数内部查找上下文是否有name的声明,有声明。但是赋值操作不能提前,所以类型为undefined
    var name="bbb";//赋值操作
    alert(typeof name);//string
}
test();

但是下面代码段,运行结果是什么?
<script type="text/javascript">
alert(typeof name);
var name="hello world";
alert(typeof name);
</script>

程序运行结果是:string,string。这里就弄晕了,不知道怎么分析和解释了。表明上我觉得我理解了变量声明提前,但是用学到方法分析上面代码段,我会得出错误的结果。那么变量的赋值和在函数外部(全局变量)还是函数内部(局部变量)有关系?
Javascript 相关文章推荐
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
Feb 15 Javascript
jquery使用append(content)方法注意事项分享
Jan 06 Javascript
深入浅析AngularJS中的module(模块)
Jan 04 Javascript
理解Javascript文件动态加载
Jan 29 Javascript
JS实现的跨浏览器解析XML文件实例
Jun 21 Javascript
js的OOP继承实现(必看篇)
Feb 18 Javascript
微信小程序遇到修改数据后页面不渲染的问题解决
Mar 09 Javascript
Vue.js 表单控件操作小结
Mar 29 Javascript
浅谈webpack-dev-server的配置和使用
May 17 Javascript
简述vue-cli中chainWebpack的使用方法
Jul 30 Javascript
JavaScript实现旋转木马轮播图
Mar 16 Javascript
jdk1.8+vue elementui实现多级菜单功能
Sep 24 Javascript
Javascript实现页面跳转的几种方式分享
Oct 26 #Javascript
javascript中简单的进制转换代码实例
Oct 26 #Javascript
javascript通过navigator.userAgent识别各种浏览器
Oct 25 #Javascript
javascript上传图片前预览图片兼容大多数浏览器
Oct 25 #Javascript
图片动画横条广告带上下滚动的JS代码
Oct 25 #Javascript
使用 Node.js 做 Function Test实现方法
Oct 25 #Javascript
详细介绍8款超实用JavaScript框架
Oct 25 #Javascript
You might like
服务器端解压缩zip的脚本
2006/12/22 PHP
PHP 截取字符串 分别适合GB2312和UTF8编码情况
2009/02/12 PHP
php中通过curl检测页面是否被百度收录
2013/09/27 PHP
PHP无限分类(树形类)
2013/09/28 PHP
php实现图片添加描边字和马赛克的方法
2014/12/10 PHP
PHP callback函数使用方法和注意事项
2015/01/23 PHP
php利用gd库为图片添加水印
2016/11/09 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
对laravel的session获取与存取方法详解
2019/10/08 PHP
javascript 动态添加事件代码
2008/11/30 Javascript
ext jquery 简单比较
2010/04/07 Javascript
onmouseover和onmouseout的一些问题思考
2013/08/14 Javascript
JavaScript实现基于Cookie的存储类实例
2015/04/10 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
vue增删改查的简单操作
2017/07/15 Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
2018/04/21 Javascript
详解在React中跨组件分发状态的三种方法
2018/08/09 Javascript
Bootstrap实现前端登录页面带验证码功能完整示例
2020/03/26 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
Python随机生成彩票号码的方法
2015/03/05 Python
使用Python实现一个简单的项目监控
2015/03/31 Python
Python3字符串学习教程
2015/08/20 Python
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
python实现机器学习之元线性回归
2018/09/06 Python
Python使用统计函数绘制简单图形实例代码
2019/05/15 Python
sklearn的predict_proba使用说明
2020/06/28 Python
strstr()的简单实现
2013/09/26 面试题
vue项目实现分页效果
2021/03/24 Vue.js
工程专业应届生求职信
2014/02/19 职场文书
国际贸易毕业生求职信范文
2014/02/21 职场文书
化工专业自荐书
2014/06/16 职场文书
2015年酒店工作总结范文
2015/04/07 职场文书
vue实现锚点定位功能
2021/06/29 Vue.js
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL