【问题】分别求下面程序的输出结果:

1.
<script type="text/javascript">
var a = 10;
sayHi();
function sayHi() {
a = a + 10;
document.write(a);
}
document.write(a);
</script>
--输出:20 20
2.
<script type="text/javascript">
var a = 10;
sayHi();
function sayHi() {
var a = a + 10;
document.write(a);
}
document.write(a);
</script>
--输出:NaN 10
3.
<script type="text/javascript">
var a = 10;
sayHi();
function sayHi() {
a = a + 10;
document.write(a);
return a;
}
document.write(a);
document.write(sayHi() + 10);
</script>
--输出:20 20 30 40
4.
<script type="text/javascript">
var a = 10;
sayHi();
function sayHi() {
var a = a + 10;
document.write(a);
return a;
}
document.write(a);
document.write(sayHi() + 10);
</script>
--输出:NaN 10 NaN NaN

【分析】第1题和第3题比较容易理解。 第2题和第4题呢,就需要分析分析了。

以上测试主要考察的是变量作用域知识。 在函数里,局部变量优先级比全局变量优先级高,这本没什么,但若局部变量与全局变量重名,那就有的说了。sayHi里边,var a 就相当于 a 跟外边没联系了。重新定义a = a+10 ,那等号右边的a还没给个确切的值(此时输出的a是undefined)呢, 所以,执行var a=a+10后,a的值为NaN (注意:因为是参与了加法运算,所以是NaN,而不是undefined)。

且看如下代码:

<script type="text/javascript">
var str='test';
function shuchu(){
document.write(str+'<br/>');
var str='world';
document.write(str+'<br/>');
}
shuchu();
</script>
--输出:
undefined
world

原因:局部变量作用于整个作用域.
 原因解释:正因为局部变量作用于整个作用域,所以函数shuchu中的第一行document.write(str+'<br/>');中的str是用的局部变量,然而此时尚未赋值,所以会出现undefined.

【如果C#】
以上是在js脚本中的情况。 如下c#代码在编译时会报错:使用了未赋值的局部变量"a"

public class TestScope
{
int a = ;
void SayHi()
{
int a = a + ;
Console.WriteLine(a);
}
}

同样,如下c#代码在编译时会报错:局部变量"a"在声明之前无法使用。局部变量的声明隐藏字段"TestScope.a"

public class TestScope
{
int a = ;
void SayHi()
{
a = ;
int a = ;
}
}

一道js面试题看变量的作用域的更多相关文章

  1. new与属性访问的顺序,从一道JS面试题说起

    这段时间一直在研究设计模式,在看工厂模式的时候,看到一段代码 VehicleFactory.prototype.createVehicle = function ( options ) { if( o ...

  2. 一道JS面试题引发的血案

    刚入职新公司,属于公司萌新一枚,一天下午对着屏幕看代码架构时. BI项目组长给我看了一道面试别人的JS面试题. 虽然答对了,但把理由说错了,照样不及格. 话不多说,直接上题: var a = 1; s ...

  3. 关于一道JS面试题的思考

    题目: ; i < ; i++) { setTimeout(function() { console.log(new Date, i); }, ); } console.log(new Date ...

  4. 一道JS面试题所引发的"血案",透过现象寻本质,再从本质看现象

    觉得本人写的不算很烂的话,可以登录关注一下我的GitHub博客,新手写东西写的不好之处,还望见谅,毕竟水平有限,写东西只为交流提高,一起学习,还望大神多加指点,指出纰漏,和提出宝贵的意见,博客会坚持写 ...

  5. 网易JS面试题与Javascript词法作用域说明

    调用对象位于作用域链的前端,局部变量(在函数内部用var声明的变量).函数参数及Arguments对象都在函数内的作用域中--这意味着它们隐藏了作用域链更上层的任何同名的属性. 2010年9月14日, ...

  6. 一道js面试题

     当然这道面试题并不一定就能在你面试的时候遇到,但是不怕一万就怕万一,会的多一些还是好的. 问:怎么判断一串字符中哪个字符出现的最多,最多几次或者这串字符分别有哪些,每个字符出现了几次.写你请出运算代 ...

  7. 腾讯的一道js面试题(原型)

    有一只小狗叫花花,它会“汪汪”叫,他的同伴也会汪汪叫,后来环境发生了变化,新出生的狗不会再“汪汪”叫,而变成“呜呜”叫. 试通过继承来达到目的 function Dog(){ 2 this.bark ...

  8. 一道经典JS面试题

    超过80%的候选人对下面这道JS面试题的回答情况连及格都达不到.这究竟是怎样神奇的一道JS面试题?他考察了候选人的哪些能力?对正在读本文的你有什么启示? 不起眼的开始 招聘前端工程师,尤其是中高级前端 ...

  9. 一道经典的js面试题

    # 声明:学习编程语言最好的方式就是通过实例学习 ## 下面是我在博客上看到的一道js面试题,可以说非常经典,下面会以最简单的方式让你理解题目:```bashfunction Foo() { getN ...

随机推荐

  1. mybatis框架中分页的实现

    2.分页的实现? 分页的时候考虑的问题: 分页的大小,分页的索引. 比如:分页的大小为10,分页的起始索引为1(索引从1开始) 第一页:1到10.    起始行号: (页的索引-1)*分页大小+1 结 ...

  2. Sublime Text 安装Emmet

    1.简单的安装方法 从菜单 View - Show Console 或者 ctrl + ~ 快捷键,调出 console.将以下 Python 代码粘贴进去并 enter 执行,不出意外即完成安装.以 ...

  3. 移动端前端笔记 — 遇到的常见JS与CSS问题及解决方法 ( 摘自zdwzdwzdw)

    笔者接触移动前端快一年了,特将平时的一些笔记整理出来,希望能够给需要的人一些小小的帮助.同时也由于笔者的水平有限,虽说都是笔者遇到过使用过的,但文中可能也会出现一些问题或不严谨的地方,望各位指出,不胜 ...

  4. 浅入了解GCD 并发 并行 同步 异步 多线程

     什么是 GCD?! GCD就是一个函数库(废话) 用来压榨系统的资源,解决多线程处理中一些问题的库(知道这个就够了,很多电影角色都是因为知道太多死得很惨!!!!!) 1.并发与并行 Concurre ...

  5. jquery选择器总结 转自(永远的麦子)

    jQuery选择器总结 阅读目录 1, 基本选择器? 2, 层次选择器? 3, 过滤选择器? 4, 表单选择器? jQuery选择器共有四大类,分别为基本选择器,层次选择器,过滤选择器和表单选择器.下 ...

  6. 中国UTM分区

    高斯-克吕格投影是“等角横切圆柱投影”,投影后中央经线保持长度不变,即比例系数为1: UTM投影是“等角横轴割圆柱投影”,圆柱割地球于南纬80度.北纬84度两条等高圈,投影后两条割线上没有变形,中央经 ...

  7. 算法入门笔记------------Day2

    1.开灯问题 有n盏灯,编号为1-n,第一个人把所有灯打开,第二个按下所有编号为2的倍数的开关(这些灯都被关掉),第三个人按下所有编号为3的倍数的开关,依次类推,一共有k个人,问最后有哪些灯开着?输入 ...

  8. hdu 1394 Minimum Inversion Number(树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给你一个0 — n-1的排列,对于这个排列你可以将第一个元素放到最后一个,问你可能得到的最 ...

  9. dataGrid转换dataTable

    #region dataGrid转换dataTable   /// <summary>   /// dataGrid转换dataTable   /// </summary>   ...

  10. iOS进阶_地图上定位的标志——大头针

    一.添加大头针 地图使用的框架是MapKit 大头针走的是MKAnnotation协议 /* 注意:因为是满足协议MKAnnotation,所以没有MKAnnotation的系统大头针类,必须自定义大 ...