【发布时间】:2010-11-04 12:03:54
【问题描述】:
我今天一直在玩 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 怪癖?
[更新]
怪异仍在继续,设法让它工作,但它似乎取决于每个循环之前发生的事情。所以回顾一下这是行不通的:
<%
[ 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 早在什么时候)!不过还是希望得到深入的解释,这样我可以更好地避免它。
【问题讨论】:
-
奇特的......就好像它直到它被传递到一个var中才查找原型链。出于好奇,在 1.2.5 上会发生同样的事情吗?如果在 1.3 中使用
Array.from([1,2,3]).each()会怎样? -
Array.from 有效,当我将它添加到我的代码顶部时,我的原始循环也有效!这导致我在我的问题更新中发表评论。它不是 Mootools 问题,我猜只是 ASP“不按这种方式构建”的问题。 Moo 1.2 做了同样的事情。
-
啊,所以它不会原型数组,直到它“看到”一个实例?好的。 :)
标签: asp-classic mootools javascript