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

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. hibernate配置文件中的schema="dbo"在MySQL数据库不可用

    把项目的数据库由SQL Server更改为MySQL之后,发现hibernate报错. 问题在于schema="dbo",使用SQL Sever数据库时正常,使用MySQL数据库需 ...

  2. MySQL提示符含义

    http://www.splaybow.com/post/mysql-prompt-introduce.html mysql> 准备好接受新命令. 说明:正常等待输入的提示符. -> 等待 ...

  3. Number()数据类型转换

    Number() 如果是 Boolean 值, 和.如果是数字值,只是简单的传入和返回.如果是 .如果是 undefined,返回NaN. 如果是字符串,遵循下列规则:    如果字符串中只包含数字( ...

  4. HTML5 Web Worker的使用

    Web Workers 是 HTML5 提供的一个javascript多线程解决方案,我们可以将一些大计算量的代码交由web Worker运行而不冻结用户界面. 一:如何使用Worker Web Wo ...

  5. Android Studio--Gradle基础(转)

    原文链接:http://stormzhang.com/devtools/2014/12/18/android-studio-tutorial4/ 其实很早之前也写了一篇Gradle的基础博客,但是时间 ...

  6. 高德地图API编译警告

    版本: V2.1.1 警告内容: (null): warning: (i386) /Users/xiaominghan/Desktop/autonavi/MAMapKit_3D_r923_201310 ...

  7. 转行IT行业的心路历程2

    2011/07-2016/12 11年毕业之后阴差阳错的到了宁波慈星股份,学习了针织机械.当初的想法很简单从沈阳到南方,因为南方小厂多机会多,因为我的目标就是当老板(呵呵,大部分的人的目标都是吧,现在 ...

  8. c# WebBrower 与 HttpRequest配合 抓取数据

    今天研究一个功能,发现一个问题. 通过webbrower模拟用户自动登录可以完成,并且可以取到相对应的页面内容. 但是如果页面中通过ajax,动态加载的内容,这种方式是取不到的,于是用到了httpRe ...

  9. VC 单文档视图分割

    http://blog.csdn.net/smartwhitehorse/article/details/6707183 主要使用类:CSplitterWnd 问题:分割线的固定,需要重写CSplit ...

  10. 类型“System.Windows.Markup.IUriContext”在未被引用的程序集中定义 解决办法

    错误 CS0012: 类型“System.Windows.Markup.IUriContext”在未被引用的程序集中定义.必须添加对程序集“System.Xaml, Version=4.0.0.0, ...