读书人

几道简单出错的JavaScript题目

发布时间: 2013-07-09 09:50:47 作者: rapoo

几道容易出错的JavaScript题目

下面这几道JavaScript题目大多来自于周五的一个小分享。都是很小的题目,但是很容易犯错。有一些是语言特性使然,有一些则是语言本身没有设计好而留下的陷阱。结果就是,遇到的人很容易陷进去骂娘,这些东西是略有些反直觉,感兴趣的不妨看看,平时我们还是尽量少些这样似是而非的代码。

1.

123456789101112131415161718function 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.

12345function a (x) {????return x * 2;}var a;console.log(a);

这段代码中,其实var a并没有任何影响,输出的是a(x)这样的方法签名。

3.

1234567891011121314c = 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);

这道题是比较变态的。

读书人网 >JavaScript

热点推荐