一个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.AutoComplete.js中文修正版(支持firefox)
Apr 09 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
Apr 23 Javascript
javascript+canvas制作九宫格小程序
Dec 28 Javascript
Backbone.js框架中Model与Collection的使用实例
May 07 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
Jul 18 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
Oct 31 Javascript
jQuery实现图片滑动效果
Mar 08 Javascript
js简单实现网页换肤功能
Apr 07 Javascript
JS实现css hover操作的方法示例
Apr 07 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
Jul 19 Javascript
vue-cli中的webpack配置详解
Sep 25 Javascript
Vue中的异步组件函数实现代码
Jul 20 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
全国FM电台频率大全 - 26 西藏自治区
2020/03/11 无线电
一个简单的PHP投票程序源码
2007/03/11 PHP
说明的比较细的php 正则学习实例
2008/07/30 PHP
[原创]php实现数组按拼音顺序排序的方法
2017/05/03 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
2019/05/09 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
2019/06/12 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
取得传值的函数
2006/10/27 Javascript
[HTML/CSS/Javascript]WWTJS
2007/09/25 Javascript
JAVASCRIPT下判断IE与FF的比较简单的方式
2008/10/17 Javascript
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
用jquery实现输入框获取焦点消失文字
2013/04/27 Javascript
js动态添加事件并可传参数示例代码
2013/10/21 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
Vue使用json-server进行后端数据模拟功能
2018/04/17 Javascript
Js中使用正则表达式验证输入是否有特殊字符
2018/09/07 Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
2019/04/15 Javascript
微信小程序request请求封装,验签代码实例
2019/12/04 Javascript
vue-router 控制路由权限的实现
2020/09/24 Javascript
Python 实现随机数详解及实例代码
2017/04/15 Python
python 字符串转列表 list 出现\ufeff的解决方法
2017/06/22 Python
matplotlib简介,安装和简单实例代码
2017/12/26 Python
Python实现模拟登录网易邮箱的方法示例
2018/07/05 Python
Python设计模式之桥接模式原理与用法实例分析
2019/01/10 Python
用python生成与调用cntk模型代码演示方法
2019/08/26 Python
关于css中margin的值和垂直外边距重叠问题
2020/10/27 HTML / CSS
中国第一家杂志折扣订阅网:杂志铺
2016/08/30 全球购物
意大利大型购物中心:Oliviero.it
2017/10/19 全球购物
Giglio英国站:意大利奢侈品购物网
2018/03/06 全球购物
单位人事专员介绍信
2014/01/11 职场文书
校园学雷锋广播稿
2014/10/08 职场文书
趵突泉导游词
2015/02/03 职场文书
会计试用期自我评价
2015/03/10 职场文书
考勤制度通知
2015/04/25 职场文书
js之ajax文件上传
2021/05/13 Javascript
win sever 2022如何占用操作主机角色
2022/06/25 Servers