一个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 相关文章推荐
你的编程语言可以这样做吗?
Sep 07 Javascript
jQuery学习笔记之jQuery原型属性和方法
Jun 09 Javascript
jQuery中:last-child选择器用法实例
Dec 31 Javascript
获取阴历(农历)和当前日期的js代码
Feb 15 Javascript
jQuery事件绑定方法学习总结(推荐)
Nov 21 Javascript
EditPlus中的正则表达式 实战(4)
Dec 15 Javascript
javascript replace()第二个参数为函数时的参数用法
Dec 26 Javascript
Vue组件tree实现树形菜单
Apr 13 Javascript
JQuery 获取多个select标签option的text内容(实例)
Sep 07 jQuery
快速处理vue渲染前的显示问题
Mar 05 Javascript
Vue.js实现可配置的登录表单代码详解
Mar 29 Javascript
vue-router 起步步骤详解
Mar 26 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
收集的PHP中与数组相关的函数
2007/03/22 PHP
PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法
2015/11/11 PHP
textarea的value是html文件源代码,存成html文件的代码
2007/04/20 Javascript
javascript脚本编程解决考试分数统计问题
2008/10/18 Javascript
JQuery 获取和设置Select选项的代码
2010/02/07 Javascript
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
JavaScript的Polymer框架中dom-repeat与VM的相关操作
2015/07/29 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
javaScript中的原型解析【推荐】
2016/05/05 Javascript
jQuery中选择器的基础使用教程
2016/05/23 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
微信小程序之picker日期和时间选择器
2017/02/09 Javascript
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
node前端模板引擎Jade之标签的基本写法
2018/05/11 Javascript
vue自定义指令实现仅支持输入数字和浮点型的示例
2019/10/30 Javascript
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
wtfPython—Python中一组有趣微妙的代码【收藏】
2018/08/31 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
python运用sklearn实现KNN分类算法
2019/10/16 Python
python字符串常用方法及文件简单读写的操作方法
2020/03/04 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
2020/04/30 Python
HTML5中Localstorage的使用教程
2015/07/09 HTML / CSS
美国排名第一的泳池用品直接来源:In The Swim
2019/09/23 全球购物
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
音乐系毕业生自荐信
2013/10/27 职场文书
节电标语大全
2014/06/23 职场文书
学校组织向国旗敬礼活动方案(中小学适用)
2014/09/27 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
专家推荐信范文
2015/03/26 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
2015年教师见习期工作总结
2015/05/20 职场文书
先进个人主要事迹范文
2015/11/04 职场文书
2016应届大学生自荐信模板
2016/01/28 职场文书
掌握这项技巧,一年阅读300本书不是梦
2019/09/12 职场文书