eval有时候好像不可替代啊。

BooJS 2011-08-16 07:48:12
有这么个情况,看代码
<html>
<body>
<script>
var mmBase = ':(';
function readcv(){
var mmBase = ':)';
function read(v){
//除了用eval能得到上级局部域的值(笑脸),还有啥方法?
//return eval('mm'+v);
}
alert(read('Base'));
}
readcv();
</script>
</body>
</html>


根据串找出相应局部变量的值,除了用eval,还有啥好方法没?
因为改的是别人的代码,服务器代码生成的js代码,mm开头的变量定义很多,不想也不敢把变量提到window域。
...全文
248 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
最后一个菜鸟 2011-08-17
  • 打赏
  • 举报
回复
this
BooJS 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 prototyper 的回复:]

JScript code

<html>
<body>
<script>
var mmBase = ':(';
function readcv(){
var mmBase = ':)';
function read(v){
//除了用eval能得到上级局部域的值(笑脸),还有啥方法?
return ……
[/Quote]
这个我有想过,可惜new Function读取的变量是全局域的,是个哭脸。呵呵
softroad 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 prototyper 的回复:]

JScript code

<html>
<body>
<script>
var mmBase = ':(';
function readcv(){
var mmBase = ':)';
function read(v){
//除了用eval能得到上级局部域的值(笑脸),还有啥方法?
return ……
[/Quote]

以前见过就是这个方法。
prototyper 2011-08-16
  • 打赏
  • 举报
回复

<html>
<body>
<script>
var mmBase = ':(';
function readcv(){
var mmBase = ':)';
function read(v){
//除了用eval能得到上级局部域的值(笑脸),还有啥方法?
return Function('return mm' + v)();
}
alert(read('Base'));
}
readcv();
</script>
</body>
</html>
MuBeiBei 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 boojs 的回复:]
引用 5 楼 mubeibei 的回复:

引用 2 楼 boojs 的回复:
引用 1 楼 mubeibei 的回复:

JScript code
<script>
var mmBase = ':(';
function readcv(){
var mmBase = ':)';
function read(v){
//除了用eval能得到上级局部域的值(笑脸),还有啥方法?……
[/Quote]

如果这样的话,我觉得你还是用eval好~·
也能节省好多没必要的开销。
BooJS 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mubeibei 的回复:]

引用 2 楼 boojs 的回复:
引用 1 楼 mubeibei 的回复:

JScript code
<script>
var mmBase = ':(';
function readcv(){
var mmBase = ':)';
function read(v){
//除了用eval能得到上级局部域的值(笑脸),还有啥方法?
return {
……

不错,是个……
[/Quote]
嗯,我再想想。
MuBeiBei 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 boojs 的回复:]
引用 3 楼 mubeibei 的回复:

引用 2 楼 boojs 的回复:
引用 1 楼 mubeibei 的回复:

JScript code
<script>
var mmBase = ':(';
function readcv(){
var mmBase = ':)';
function read(v){
//除了用eval能得到上级局部域的值(笑脸),还有啥方法?……
[/Quote]


如果这样的话,我觉得你还是用eval好~·
也能节省好多没必要的开销。
MuBeiBei 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 boojs 的回复:]
引用 1 楼 mubeibei 的回复:

JScript code
<script>
var mmBase = ':(';
function readcv(){
var mmBase = ':)';
function read(v){
//除了用eval能得到上级局部域的值(笑脸),还有啥方法?
return {
……

不错,是个办法。
不过所有局部变量要设置一遍,这……
[/Quote]


先用循环把所有变量生成一个json对象。

然后在return json['mm'+v];

这样就行了~·
BooJS 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mubeibei 的回复:]

引用 2 楼 boojs 的回复:
引用 1 楼 mubeibei 的回复:

JScript code
<script>
var mmBase = ':(';
function readcv(){
var mmBase = ':)';
function read(v){
//除了用eval能得到上级局部域的值(笑脸),还有啥方法?
return {
……

不错,是个……
[/Quote]
理论上确实可以循环生成一次,无奈服务器代码层层嵌套,那个变量生成代码已经封装成个函数,里面又有不少逻辑,该生成什么变量,不该生成什么变量,都有判定。好不麻烦。
如果这样我还是eval算了。
不过你的思路是没错的。
MuBeiBei 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 boojs 的回复:]
引用 1 楼 mubeibei 的回复:

JScript code
<script>
var mmBase = ':(';
function readcv(){
var mmBase = ':)';
function read(v){
//除了用eval能得到上级局部域的值(笑脸),还有啥方法?
return {
……

不错,是个办法。
不过所有局部变量要设置一遍,这……
[/Quote]


既然是动态生成的~·那能用for循环吗?循环一遍就行了~·
BooJS 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mubeibei 的回复:]

JScript code
<script>
var mmBase = ':(';
function readcv(){
var mmBase = ':)';
function read(v){
//除了用eval能得到上级局部域的值(笑脸),还有啥方法?
return {
……
[/Quote]
不错,是个办法。
不过所有局部变量要设置一遍,这个不太好,因为mm开头的变量名都是动态生成的。
MuBeiBei 2011-08-16
  • 打赏
  • 举报
回复
<script>
var mmBase = ':(';
function readcv(){
var mmBase = ':)';
function read(v){
//除了用eval能得到上级局部域的值(笑脸),还有啥方法?
return {
'mmBase':mmBase
}['mm'+v]
}
alert(read('Base'));
}
readcv();
</script>

87,990

社区成员

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

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