回答对这道题,所有分给你,看看自己的js能力
var tt = 'aa';
function test(){
alert(tt);
var tt = 'dd';
alert(tt);
}
test();
希望回答过后再去测试,这个题目绝对能考你作用域的概念。网易的一道面试题。反正我是回答错误了
------解决方案--------------------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的定义。
------解决方案--------------------