日期:2014-05-16  浏览次数:20329 次

回答对这道题,所有分给你,看看自己的js能力
var tt = 'aa';
function test(){
alert(tt);
var tt = 'dd';
alert(tt);
}
test(); 


希望回答过后再去测试,这个题目绝对能考你作用域的概念。网易的一道面试题。反正我是回答错误了

------解决方案--------------------
undefined dd
------解决方案--------------------
引用:
undefined dd


++
------解决方案--------------------
var tt = 'aa';
function test(){
alert(tt);
var tt = 'dd';
alert(tt);
}
test();  

==

var tt = 'aa';
function test(){
var tt;
alert(tt);
tt = 'dd';
alert(tt);
}
test();  

以上两者相同,JS对于同一作用域的变量(包括函数)会预先声明,即上面的在函数内部先执行了var tt;同样如果有函数的定义的话,也是如此。
------解决方案--------------------
js预加载导致函数内部的tt被覆盖,第一个alert()时tt在其作用域内未定义,弹出undefined,第二个弹出'dd'。

PS:我面试时用过类似的题。
------解决方案--------------------
javascript预编译和处理的问题,var申明的变量进行了预编译,赋值操作未执行,所以先输出undefined,不会报错或者输出全局变量tt的值,呵呵,很经典的问题

这个更加经典。。
var a = 10;
  function test() {
    a = 100;
    alert(a);
    alert(this.a);
    var a;
    alert(a);
  }
 test();

------解决方案--------------------
原理:一个函数被定义的时候 它的“可访问属性链”会被生成,以上函数的可访问属性链 self->window。

当它被执行的时候,首先创建函数自定义的变量(如 var a; 无论a在函数哪个地方定义,函数执行时会首先被创建,值为undifined)

函数引用到一个变量的时候,会循着“可访问属性链”查找,如果自身有定义,则不访问window。

(可访问属性链是我自定义的说法,哈哈 我忘了官方怎么称呼。)
------解决方案--------------------
在函数体内定义了a 但是在alert的时候 a还没有初始化,未赋值 所以会输出undefined
------解决方案--------------------
确实是undefind 和bb

不过,在下有个疑问
var tt = 'aa';
function test(){
alert(tt);
tt = 'dd';
alert(tt);
}
test(); 
和楼主的题目的唯一差别就是test函数内没有var
这个输出结果就是aa和bb了,

有人能给我答疑吗?
按照我的理解,无论是楼主的代码还是我代码,输出都应该是aa和bb。
因为test()刚运行时,scope内没有tt的定义,js引擎应该自动向scop chain的上一级转移(也就是window层面),在window中就有tt的定义。
------解决方案--------------------
引用:
确实是undefind 和bb

不过,在下有个疑问
var tt = 'aa';
function test(){
alert(tt);
tt = 'dd';
alert(tt);
}
test(); 
和楼主的题目的唯一差别就是test函数内没有var
这个输出结果就是aa和bb了,

有人能给我答疑吗?
按照我的理解,无论是楼主的代码还是我代码,输出都应该是aa……