一个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 使用点滴函数代码
May 20 Javascript
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
Apr 15 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
Dec 31 Javascript
jquery实现像栅栏一样左右滑出式二级菜单效果代码
Aug 24 Javascript
基于JavaScript实现一定时间后去执行一个函数
Dec 14 Javascript
JQuery实现Ajax加载图片的方法
Dec 24 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
May 26 Javascript
Bootstrap布局之栅格系统详解
Jun 13 Javascript
jQuery中deferred对象使用方法详解
Jul 14 Javascript
JavaScript解析JSON格式数据的方法示例
Jan 24 Javascript
详解Vue中组件传值的多重实现方式
Aug 16 Javascript
OpenLayer学习之自定义测量控件
Sep 28 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 is_dir() 判断给定文件名是否是一个目录
2010/05/10 PHP
php统计时间和内存使用情况示例分享
2014/03/13 PHP
Yii快速入门经典教程
2015/12/28 PHP
linux下php上传文件注意事项
2016/06/11 PHP
基于laravel缓冲cache的用法详解
2019/10/23 PHP
JQuery的ajax基础上的超强GridView展示
2009/09/18 Javascript
javascript截取字符串(通过substring实现并支持中英文混合)
2013/06/24 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
jquery选择器简述
2015/08/31 Javascript
详解AngularJS中module模块的导入导出
2015/12/10 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
javascript 闭包详解及简单实例应用
2016/12/31 Javascript
ES6解构赋值实例详解
2017/10/31 Javascript
关于Webpack dev server热加载失败的解决方法
2018/02/22 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
2019/01/08 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
python从入门到精通(DAY 1)
2015/12/20 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
Python实现打砖块小游戏代码实例
2019/05/18 Python
python集合是否可变总结
2019/06/20 Python
python爬虫 2019中国好声音评论爬取过程解析
2019/08/26 Python
python实现超市商品销售管理系统
2019/10/25 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
如何在Python3中使用telnetlib模块连接网络设备
2020/09/21 Python
森海塞尔美国官网:Sennheiser耳机与耳麦
2017/07/19 全球购物
2014年秋季开学演讲稿
2014/05/24 职场文书
促销活动总结模板
2014/07/01 职场文书
工程造价专业求职信
2014/07/17 职场文书
北大自主招生自荐信
2015/03/04 职场文书
2015社区精神文明建设工作总结
2015/04/21 职场文书
幼儿园教研工作总结2015
2015/05/12 职场文书
2015年高一班主任工作总结
2015/05/13 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python