一道隐藏欺诈的JavaScript面试题

JavaScript 2014-05-12 面试题,作用域,全局

面试题,是大多数公司录用程序员最普遍的考核关卡之一,各种刁难的面试题都层出不穷。最近一朋友发把一道JavaScript的面试题发我:

var name = "张三";

(function(){
    name = "李四";
    var name = "王五";
    alert(name); 
})();

alert(name);

虽然他已经知道运行结果,但他还是有点不太明白为什么!按照正常逻辑思维读这道题:

一、声明一个全局变量name=张三
二、声明一个匿名函数并执行
三、匿名函数内name=李四 由于不带var关键字所以是修改全局下name
四、声明一个局部变量name=王五 

所以最终弹出李四/张三,其实这道题在函数内的alert(name)弹出王五是毋庸置疑的,关键点就在于最后一句alert(name)上。按照正常逻辑思维,匿名函数内的第一句话就已经把全局变量name给改写了,然而实际上这正是错误理解的地方。因为在JavaScript的函数中只要使用var声明一个与全局变量一样的变量名,那么即使var声明语句写在后面也会让前面同名的变量被认作是局部变量,如果非要在这种情况下修改一个全局变量可以这样:

var name = "张三";

(function(){
    window.name = "李四";
    var name = "王五";
    alert(name); 
})();

alert(name);

其实现在有不少JavaScript程序员声明变量都是随处声明,如:

(function(){

    var width = 300;
    width = 200;
    var height = 400;
    height = 200;
    var name = "qttc";
 
})();

其实按照正确的习惯,应该是var声明局部变量都写在函数开头,如:

(function(){

    var width = 300,
        height = 400,
        name = "qttc";


    width = 200;
    height = 200;
 
})();

当然,基本你要用到一个全局变量时基本上你不会在函数内声明一个与全局变量名相同的局部变量,这是愚蠢的做法,可是当你程序写的非常复杂的时候,难免会犯这种低级错误,还是养成好习惯吧!

文字链接:《一道隐藏欺诈的JavaScript面试题

文章地址:http://www.qttc.net/201405437.html

除非标注,琼台博客所有博文均为原创,转载请加文字链接注明来源

乳名?小名?昵称?网名?均可

email,放心,我不会给你乱投广告的

想获得回访就把你的站点URL写上(没有留空)

[NOTICE]木要投放广告
[NOTICE]木要骂人,说不该说的话
[NOTICE]自由言论,但要遵纪守法

Comments 2

  • 我在谷歌上运行是王五张三呀。
    2015-10-20 17:42:19 [ 跟帖 ]
    1 #
  • 貌似你这个结果是错的, 结果是王武.张三
    2015-09-08 17:04:32 [ 跟帖 ]
    2 #