容易出错的JavaScript题目
1、
function Container( properties ) { var objthis = this; for ( var i in properties ) { (function(){ var t = properties[i]; objthis[ "get" + i ] = function() {return t;}; objthis[ "set" + i ] = function(val) {t = val;}; })(); }} var prop = {Name : "Jim", Age : 13};var con = new Container(prop);console.log(con.getName()); con.setName("Lucy");console.log(con.getName());console.log(prop.Name);?
这段代码会输出什么?前面两行分别是“Jim”和“Lucy”,这不会有问题;但是第三行应该输出的是“Jim”,但是有的人会误认为prop对象已被修改,故输出“Lucy”。其实在匿名函数中,properties[i]的值已经赋给了临时变量t,之后闭包对于外部变量的引用完全由t这个媒介来完成,因此prop传入以后并未发生任何属性的更改。
?
2、?
function a (x) { return x * 2;}var a;console.log(a);?
这段代码中,其实var a并没有任何影响,输出的是a(x)这样的方法签名。
?
3、?
c = 999;var c = 888;console.log(this.c); //①function b (x, y, c) { c = 6; arguments[2] = 10; console.log(c); //② console.log(this.c); //③ var c = 6; console.log(c); //④ console.log(this.c); //⑤}b(1, 2, 3, 4);?
这道题是比较变态的。
4、
var start = new Date();setTimeout( function(){ var end = new Date(); console.log(end - start); }, 1000);while(new Date() - start < 2000);?
?
JavaScript因为是单线程工作的,因此虽然回调函数设置了1000毫秒后执行,事实上在1000毫秒的时候根本得不到执行,等待到while循环执行完毕后(因此已经是2000毫秒以后了),才去执行,因此输出应该是一个大于2000的数字。
?
5、?
(function(){ console.log(typeof arguments);})();?
很多人会说打印的是array,其实,arguments不是数组,打印的是object。
?
6、
function a(){return a;}console.log(new a() instanceof a);?
应该打印的是false,其实原因很简单,new a()的时候,因为return语句,得到的不是a的实例,而是a本身,a instanceof a当然是false啦。
最后,还有一个小题目是关于Function Invocation Pattern的,我在这篇文章里有写到,就不单独贴出来了。