变量作用域问题, 如何使动态加载的代码, 如函数, 在 obj.method() 里 eval 执行后, 作用域可到达顶层.

btbtd 2006-12-23 01:28:48
为 eval 定义了方法 im, 在 eval.im() 中 执行 eval(code), 然后使在 eval(code) 里的函数和对象可在最外层调用.


附架构代码:
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>shawl.qiu template</title>
</head>
<body>
<%
var exec=eval;
exec.path='/sqJsSsFw';
exec.pathPhysical=Server.MapPath(exec.path);
exec.extension='asp';
exec.charset='UTF-8';

exec.im=function(sAct){
var sCode='';
if(!sAct){
sCode=fRcsvFso(this.pathPhysical, true);
} else {
if(!/\./.test(sAct)){
sCode=fRcsvFso(this.pathPhysical+'\\'+sAct, false, true);
} else {
sAct=sAct.replace(/\./,'\\')+'.asp';
sCode=fStmRead(this.pathPhysical+'\\'+sAct,this.charset);
}
}
sCode=fExecFile(sCode);
this(sCode);

// 导入的代码(主要为函数&&对象), 执行后, 变量作用域仅在本函数内.
/* var conn='provider=microsoft.jet.oledb.4.0;persist security info=false; data source='+
Server.MapPath("sqeditor/data/shawlqiu.mdb");

var rs=new data();
rs.cmd="'select top 10 * from shawlqiu_ order by articleid desc', conn, 1";
rs.select.all();
rs=null;*/

return sCode;
}

exec.im();

// 如何使 exec.im() 执行后, 变量作用域可以影响到这里
/* var conn='provider=microsoft.jet.oledb.4.0;persist security info=false; data source='+
Server.MapPath("sqeditor/data/shawlqiu.mdb");

var rs=new data();
rs.cmd="'select top 10 * from shawlqiu_ order by articleid desc', conn, 1";
rs.select.all();
rs=null;*/

//-------------------begin private method--------------------------//
function fStmRead(sPath, sCharset){
//sPath=Server.MapPath(sPath);
var sStr='';
var o=new ActiveXObject('adodb.stream')
with(o){
Type=2;
Mode=3;
Open;
LoadFromFile(sPath);
if(sCharset!=="")CharSet=sCharset;
var pNum=0
if(sCharset=='utf-8'||sCharset=='unicode')pNum=2;
Position=pNum
sStr=ReadText();
close;
} //shawl.qiu code
o=null;
return sStr;
}

function fRcsvFso(sPath, bRcsv, bLv){
var fso=new ActiveXObject('scripting.fileSystemObject');
var path=fso.GetFolder(sPath);
var temp='';
var strAll='';
if(!bLv){
for(var eu=new Enumerator(path.SubFolders); !eu.atEnd(); eu.moveNext()){
for(var eu_=new Enumerator(eu.item().Files); !eu_.atEnd(); eu_.moveNext()){
if(fCkExt('asp', eu_.item().Path)){
temp=fStmRead(eu_.item().Path,'utf-8');
strAll+=temp+'\n';
}
}
if(bRcsv) arguments.callee(eu.item().Path, bRcsv);
}
} else {
for(var eu_=new Enumerator(path.Files); !eu_.atEnd(); eu_.moveNext()){
if(fCkExt('asp', eu_.item().Path)){
temp=fStmRead(eu_.item().Path,'utf-8');
strAll+=temp+'\n';
}
}
} //shawl.qiu code
fso=path=null;
return strAll;
}

function fCkExt(sCk, sForCk){
if(!sCk)return false;
if(!sForCk)return false;
sForCk=sForCk.toLowerCase();
sCk=sCk.split(',');
for(var i=0, j=sCk.length; i<j; i++){
var re=new RegExp(sCk[i]+'$', 'i');
if(re.test(sForCk))return true;
} return false;
} //shawl.qiu code

function fExecFile(sStr){
if(!sStr||sStr=='')return false;
var temp='';
sStr=sStr.replace(/<\%([\s\S]*?)\%\>/g,function($0,$1){
temp+=$1+'\n';
});
temp=temp.replace(/\n[\s]*\r/g,'').
replace(/\/\*[\s\S]*?\*\//g,'').
replace(/\/\/[\s\S]*?(\r|\n)/g,'');
return temp;
} //shawl.qiu code
//-------------------end private method----------------------------//
%>
</body>
</html>
...全文
161 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
muxrwc 2006-12-23
  • 打赏
  • 举报
回复
忽忽。。。。看不明白你在问什么。。。貌似个性签名右换了的说。。
btbtd 2006-12-23
  • 打赏
  • 举报
回复
哈哈, 在弄一个通用架构, 这只是一个实现方法, 不过这个方法貌似无法解决该解决的问题.
muxrwc 2006-12-23
  • 打赏
  • 举报
回复
好多代码@_@
UP。。
btbtd 2006-12-23
  • 打赏
  • 举报
回复
MD 挖地三尺也找不到控制变量作用域的方法...
不过该问题已经变相解决掉了...

希望能来个高手, 把这个作用域诠释一下...

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧