JavaScud | Forum | JIRA | Blog |
  Dashboard > DWR中文文档 > ... > Ajax Documentation > Javascript Gotcha
  DWR中文文档 Log In View a printable version of the current page.  
  Javascript Gotcha
Added by 黑灵, last edited by 黑灵 on Sep 25, 2006
Labels: 
(None)

Javascript Gotchas

这里包含的内容是我在学习JavaScript的时候遇到希望有人能告诉我的。可以说Javascript是一个比较简单的语言的,但是其中也有一些你意想不到的陷阱。

Map的key是String类型

一些术语:有些人称之为对象,有些称之为结合数组。我在这里称之为Map。因为在面向对象的风格中我们更喜欢把它当作Map来用,而不是对象。

Javascript只有少量的内置对象(boolean, float, string, object, array),而且你可以自由的在类型之间进行转换。乍一看下面的代码,你一定会认为:这会创建一个包含两个实体的Map。但是因为所有的key都会被转换成String类型。所以实际上Map中只有一个实体:

var a = 3 + 4; // a 是数值类型 7
var b = "7";   // b 是字符串类型 7

var map = {};
map[a] = "entry 1";
map[b] = "entry 2";

alert(map[a]); // "entry 2"

把一个对象附加给一个函数是没有意义的

在多数OO语言中一个方法是知道自己是属于哪个对象的。在Javascript中当你把一个对象附加给一个函数时,这个函数实际上是不关心自己正在被谁使用的。

你一定曾经误认为下面的代码的显示结果是"1 2"(数组中有几个元素显示几次)

{
  // inside some method on an object
  var instance = "1";
  this.member = "2";
  array.sort(function(a1, a2) {
    alert(instance + " " + this.member);
    // ...
  });
}

实际上并不像你想象的那样,你会得到一个错误。尽管对象知道自己包含的函数,但是函数并不在乎自己的出身。所以当你把这个函数传递给sort程序,它已经不知道自己是哪个对象的一部分了。所以this就变成了window对象。

解决方案是把变量做为闭包的一部分。

{
  // inside some method on an object
  var instance = "1";
  this.member = "2";
  var cthis = this;
  array.sort(function(a1, a2) {
    alert(instance + " " + cthis.member);
    // ...
  });
}

这会结果是"1 2". this仍然会被忘记,但是cthis是闭包的一部分,所以我们可以在函数中访问到cthis。

Site running on a free Atlassian Confluence Open Source Project License granted to WebWork China. Evaluate Confluence today.
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.5.3 Build:#808 May 29, 2007) - Bug/feature request - Contact Administrators