今天我一直在使用Mootools 1.3服务器端。它真的很好,让它变得经典的ASP友好,但仍然充满了好处(tm)。
在向朋友展示Mootools的功能时,我遇到了一个与ASP相关的奇怪错误,这是我以前从未见过的。
Microsoft JScript runtime error '800a138f'
'Response.WriteBlock(...)' is null or not an object
导致它的代码是Mootools的一个时髦的"forEach“助手:
[1,2,3].each( function( i ) {
Response.Write( "<b>" + i + "</b>, " );
});
它真的一点也不喜欢这个代码。我注释掉了Response.Write,并且有一个空块,但它仍然抛出了错误。非常奇怪。我知道ASP做了一些优化魔术,将html块和asp块组合在一起(因此有了Reponse.WriteBlock注释),但不确定为什么这会适用于这里。
但是,下面的代码将会运行:
var fruits = [];
fruits.push( "apples" );
fruits.push( "oranges" );
fruits.each( function( fruit ) {
Response.Write( "<b>" + fruit + "</b>, " );
});
// As will this
var nums = [ 1,2,3,4,5 ];
nums.each( function(i) {
Response.Write( "<b>" + i + "</b>" );
});
有没有人知道是什么原因导致了这个错误?我将继续挖掘,但不知道是否有任何JScript的同事可以提供一些启发。可能只是ASP的一种怪癖?
更新
Wierdness还在继续,设法让它正常工作,但这似乎取决于each循环之前发生的事情。因此,简单地说,这是不起作用的:
<%
[ 1,2,3,4,5 ].each( function(i) {
Response.Write( "<b>" + i + "</b>" );
});
%>
但是这样做了(注意上面添加了var行):
<%
var something = 1;
[ 1,2,3,4,5 ].each( function(i) {
Response.Write( "<b>" + i + "</b>" );
});
%>
确实很奇怪。一定与ASP处理块的方式有关,也许解析器中有一条关于块以(它会认为是相当随机的)数组语句开头的规则,或者至少它没有被编程来期望我这样做(我不认为他们很久以前就想到了服务器端mootools )!我仍然想要一个深入的解释,这样我就可以更好地避免它。
发布于 2010-11-18 03:05:14
尝试将您的代码更改为此…
<%
;[ 1,2,3,4,5 ].each( function(i) {
Response.Write( "<b>" + i + "</b>" );
});
%>
这只是一个预感。
一般来说,使用(
或[
作为行或文件的开头而不使用分号被认为是不好的做法。主要原因与串联有关……
例如:
//foo.js
1 + 1 == 2
//bar.js
("lol, string")
//foo.js + bar.js
1 + 1 == 2("lol, string") // TypeError: number is not a function
由于bar.js
无法知道最终会在它之前包含哪些内容,因此它应该始终在(
之前包含自己的;
。
//bar.js
;("lol, string")
//foo.js + bar.js
1 + 1 == 2;("lol, string") // SUCCESS!!1!
我的预感是,ASP领域正在发生类似的怪事。
由于我们无法访问JScript的源代码或ASP框架本身,因此无法确定发生了什么。
发布于 2010-11-07 11:03:43
我从来没有在经典的asp中见过response.writeblock,
不是应该是response.write吗?
https://stackoverflow.com/questions/4096436
复制相似问题