Entries

笔记:JavaScript/AJAX开发中的几个陷阱(更)

1)在w3c的文档中我们可以看到XMLHttpRequest的send方法是可以不带任何参数的,但事实上包括FireFox在内的一些浏览器必须传入参数,如果不发送任何内容就传入null。

2)在旧版本的IE中使用XHR需要用new ActiveXObject构造来创建,很多人都习惯写成大概这个样子

function XMLHttpRequest(){
var progIDs = [ 'Msxml2.XMLHttp.6.0', 'Msxml2.XMLHttp.5.0', 'Msxml2.XMLHttp.4.0',
'Msxml2.XMLHttp.3.0', 'Msxml2.XMLHttp' ];
for (var i = 0; i < progIDs.length; i++) {
try {
var xhr = new ActiveXObject(progIDs[i]);
return xhr;
} catch (ex) {
}
}
return null;
}

但事实上出于种种奇妙的历史原因,最佳的做法是只用6.0和3.0,比方说这样:
……

function XMLHttpRequest(){
var progIDs = [ 'Msxml2.XMLHttp.6.0', 'Msxml2.XMLHttp.3.0' ];
for (var i = 0; i < progIDs.length; i++) {
try {
var xhr = new ActiveXObject(progIDs[i]);
return xhr;
} catch (ex) {
}
}
return null;
}

具体的原因可以在这里找到:http://blogs.msdn.com/sqlcrd/archive/2008/11/04/internet-explorer-msxml.aspx

3)“undefined”和“false”——在简单的条件判断中,“undefined”和“false”都可以用于表示“否”的状态,但如果用作函数/方法的参数,就会产生不同的行为——“undefined”表示没有指定这个参数,而“false”表示指定了“否”……
也就是说,下面这段代码

function get(url, async){
var xhr = new XMLHttpRequest();
xhr.open("GET", url, async);
xhr.send(null);
// 添加其它的代码
}

实际运行效果是产生一个异步请求而非同步请求!

4)对正则表达式优化——在IE(JScript)以外的JavaScript引擎实现中,大都对“在循环中使用”的“全局搜索”的正则表达式进行优化……就是说,下面这段代码:

var i;
var rx = /RegExp/ig;
var arrMatch0 = rx.exec(text);
// 一些处理代码
while(rx.lastIndex >= 0){
var rx = /RegExp/ig;
var arrMatch = rx.exec(text);
//一些同样的处理代码
}

这样糟糕的代码会被优化

var i;
var rx = /RegExp/ig;
var arrMatch0 = rx.exec(text);
// 一些处理代码
while(rx.lastIndex >= 0){
var arrMatch = rx.exec(text);
//一些同样的处理代码
}

表面上看好像化解了一些因为程序编写者粗心而造成的逻辑问题……
但实际上这种优化问题才大呢!现在有几个人写程序还会犯这种低级错误啊!?

况且像这样的嵌套循环:

for(i in collString){
var rx = /RegExp/ig;
var arrMatch;
while(arrMatch = rx.exec(collString[i]){
// 作一些处理
}
}

会被优化

var rx = /RegExp/ig;
for(i in collString){
var arrMatch;
while(arrMatch = rx.exec(collString[i]){
// 作一些处理
}
}

……
这样执行当然得不到预期的结果啊!!
为了照顾这些脚本引擎的自作聪明,要用new RegExp构造……

var rxProto = /RegExp/ig;
for(i in collString){
var arrMatch;
var rx = new RegExp(rxProto);
while(arrMatch = rx.exec(collString[i]){
// 作一些处理
}
}

或者直接重置lastIndex

var rx = /RegExp/ig;
for(i in collString){
var arrMatch;
rx.lastIndex = 0;
while(arrMatch = rx.exec(collString[i]){
// 作一些处理
}
}



5)正确地使用“this”指针——this指针表示“这个(方法/函数所属的)对象”,具体研究起来的话分是要细分成这样的情况:
①对于在任何情况下声明的、没有附加为一个对象的方法的函数,调用时“this”的值都为全局对象(在网页上就是window)。
——即使是在一个封闭区间内声明的非全局函数也会如此,所以用这个特性可以在一些比较罕见的不能直接访问全局对象的情况下直接获得全局对象的引用。
——同时这也说明,即使是在一个方法中产生的函数,在没有特别指明的情况下其“this”指针也是指向全局对象,而非方法所属的对象本身。
②对于一个对象的方法实现来说,其中的“this”是指向所属对象的。如果方法被独立使用,就和普通的函数一样,其“this”指向全局对象。使用函数/方法的“call”和“apply”方法会强制替换“this”指针。
引用此文章(FC2博客用户)
http://shinron4.blog126.fc2blog.us/tb.php/16-6fa42012

引用

留言

发表留言

发表留言
只对管理员显示

Appendix

自我介绍

优雅的神棍 / Elegant Tales

Author:优雅的神棍 / Elegant Tales
神棍你好,神棍再见。

最新引用

QR

QR

羔羊们啊

加为好友

和此人成爲好友

搜寻栏