请帮忙分析一下下面的代码:var s="{a:'111'}";
alert(typeof s);
var c=eval(s);
alert(c);//为什么是111而不是{a:'111'}?
alert(typeof c);//为什么是string而不是object?
alert(typeof s);
var c=eval(s);
alert(c);//为什么是111而不是{a:'111'}?
alert(typeof c);//为什么是string而不是object?
解决方案 »
- 此段代码的应用场景是什么,烦请高手举个实例?
- 谁能说一下,下列代码的详细意思?
- 有关EXT的tree叶子节点的click事件,弹出一个tabpanel
- WebBrowser打印怎么知道是否完成?
- Web开发组件:多级单选下拉框,可代替级联下拉框
- JS 如何实现自动增加单元格
- ExtJs 分页问题,看不到数据,在线等
- ie8下jQuery的slideDown,slideUp动画效果没有ie7流畅?是浏览器性能吗?应该怎么处理这类动画效果?
- 如何在浏览器地址栏显示某个站点的地址或域名
- 如何动态为div标签创建一个font标签?
- js createElement 创建DIV getElementById 获取错误!!!!
- form.action 参数
var s="{a:'111'}";
alert(typeof s);
eval("var c="+s); //这样用
alert(c);
alert(typeof c);
</script>
function evalJSON(str){
if(typeof str == 'string'){alert('===');
return eval('(' + str + ')');
}
}var s="{'a':'111','b':'222',kk:3343}";
alert(typeof s);
var c = evalJSON(s);
alert(c);
alert(c.kk);//为什么是111而不是{a:'111'}?
alert(typeof c);//为什么是string而不是object?
</script>
不过我还有个疑问:var s="{a:'111'}";
alert(s);
alert(typeof s);
eval(s);
alert(s);//为什么是{a:'111'}而不是[object,Object]?
alert(typeof s);//为什么是string而不是object?
var a=10;
var c=a+100;
alert(c)//110
alert(a)//10你没进行赋值操作变量怎么会改变?
--- 结贴,给分 ---
var s="{a:'111'}";
alert(typeof s);
var c=eval('['+s+']');//为什么这里的[]、()都可以生成对象{}却不可以呢?这里的括号是起什么作用?
alert(c);
alert(typeof c);
[]括号代表 = new Array()
var s="{a:'111'}";
alert(s);
alert(typeof s);
var o=eval('['+s+']');
alert(s);//为什么是{a:'111'}而不是[object,Object]?
alert(typeof s);//为什么是string而不是object?
alert(o);//为什么这里就是[object,Object]?
alert(typeof o);//为什么这里就是object?
var o=eval('['+s+']'); 你本来就用eval函数把'[' + s + ']'转换成对象了啊。这个不难理解吧?
呵呵,你问的我都想笑。你对函数变量的作用域都没搞清楚,晕死!
你看看,在你
var o=eval('['+s+']');
alert(s);//为什么是{a:'111'}而不是[object,Object]?
的时候,你的变量s被赋予新的值了么?答案:没有。你的var o=eval('['+s+']');的作用是把字符串s通过函数eval()把新的值付给了新的变量 o 。而你原来的变量s的值没有变化啊。当然还是原来的值了。你的
alert(o);//为什么这里就是[object,Object]?
里面的o,是被eval函数传化了的。你的var s="{a:'111'}"; 去掉双引号就是一个hash,而eval函数的作用就是帮你去掉这个双引号,并且帮你把这个字符串传华为js的对象Object。要是还有疑问,请你去买本书,看看我的头像上面的图片,那本书,你看完了,基本的js就都可以应用了。
哎,老兄,我服了你了
-- 给分 --
各位辛苦了!!!
我也知道在JS的代码中
{}括号代表 var s=new Object(); 就是一个空对象
但是var c=eval('{'+s+'}');转化失败。
[]括号代表 = new Array() ;也可以看作对象来对待
var c=eval('['+s+']');转化成功
()在JS代码中不代表什么创建对象的方式吧?
但是这里var c=eval('('+s+')');
却能转化成功
这究竟是为什么?
还有就是
var s="{a:'111'}";
alert(typeof s);
var c=eval(s);
alert(c);//为什么是111,他把a扔到哪里了?
alert(typeof c);
至于
var s="{a:'111'}";
alert(typeof s);
var c=eval(s);
alert(c);//为什么是111,他把a扔到哪里了?
alert(typeof c);
这里的 a 就是一个key,明白否?而你这么写,js默认的就是这个表达式的值,而且是里面的元素只有一个的情况才会有这种情况,如果是2个元素呢?如果你这么写,你看,他就会报错了var s="{a:'111',b:'2222'}";
alert(typeof s);
var c=eval(s);
alert(c);//为什么是111,他把a扔到哪里了?
alert(typeof c);
var s="{a:'111',b:'2222'}";
alert(typeof s);
var c=eval(s);
alert(c);//为什么是111,他把a扔到哪里了?
alert(typeof c);这种情况会报错,而你写的var s="{a:'111'}";不报错。因为var s="{a:'111',b:'2222'}";再被eval转换之后,会有2个key,后面的alert()不知道该显示那个key对应的数值。而你写的,只有一个key,默认就把key:a 对应的数值显示了出来。你可以试一试。
那中括号也是保持字符串的完整性?
如果中括号也是保持字符串的完整性可以的话,大括号保持字符串的完整性为什么就不可以?
a既然是一个key的话,那就应该有对象存在吧?不是有key的也是对象吗?
可是并没有看到什么对象存在啊?
就像下面这样:
eval('var c=100');//等价于var c=100
或者eval('alert("hello")'););//等价于alert("hello")
上面的赋值操作和函数调用是可执行的字符串,这很好理解。
就是动态执行脚本的意思。
书上和查到的资料都没有说可不可以使用小括号啊?
见到的例子顶多也就是使用小括号包一下JSON字符串,
还没有见到使用中括号包一下JSON字符串的。
但是它确实是转化成功了啊!
检查 JScript 代码并执行. eval(codeString)必选项 codestring 参数是包含有效 JScript 代码的字符串值。这个字符串将由 JScript 分析器进行分析和执行。说明
eval 函数允许 JScript 源代码的动态执行。例如,下面的代码创建了一个包含 Date 对象的新变量 mydate :eval("var mydate = new Date();");
传递给 eval 方法的代码执行时的上下文和调用 eval 方法的一样. 传递给 eval 方法的代码执行时的上下文和调用 eval 方法的一样.
——这句是关键,可见 eval 执行一个代码行或若干代码行,
而如果是某行的部分代码,其执行结果就很难预测了,
因为没有对 eval 滴返回值做明确说明,这也就是 lz 困惑所在!归根结底,还是用法滴问题!!!
// -----------------------------------
// 正确用法
function test() {alert('123');}
var s = "function test() {alert('123');}";
alert(eval(s)); // undefinedalert(test); // function test() {alert('123');}
test(); // 123// -----------------------------------
// 错误用法
/*
function() {alert('123');}
var s = "function() {alert('123');}";
alert(eval(s)); // undefinedvar test = eval(s);
alert(test); // undefined
test(); // Error
*/
恩,就是啊!
许多的文档只是说eval 执行一个代码行或若干代码行,
由于JSON是这几年新的应用,就连eval把JSON解析为一个对象
都没有怎么说清楚,至于括号的问题,连提都没有提,
都是上来就是一大段代码,有有括号的,也有没有括号的。
就是没有说明为什么使用小括号?
至今还没有见到过使用中括号的,但是中括号确实也可以。
还有就是从来没有见过清晰地解释eval的返回值是怎样的一种情况的
所以才给我造成了这么大的困惑。
function test() {alert('123');}
var s = "test";//test 代表一段可执行的代码
alert(eval(s)); // 弹出 function test() {alert('123');} 为 什么不执行? alert(test); // function test() {alert('123');}
test(); // 123
function test() {alert('123');}
var s = "test";//test 代表一段可执行的代码
alert(eval(s)); // 弹出 function test() {alert('123');} 为 什么不执行? function test() {alert('123');}
var s = test;//test 代表一段可执行的代码 比较上面,用不用引号都一样!!alert(eval(s)); // 弹出 function test() {alert('123');} 为 什么不执行? alert(test); // function test() {alert('123');}
test(); // 123
n=m;
alert(n);
alert(eval("n=m"));
alert(eval(n));//弹出 12 这儿为什么也能执行?
js 中函数名就是函数指针,执行时必须加()!L@_@K
function test() {alert('123');}
var s = "test";//test 代表一段可执行的代码
alert(eval(s));
// 弹出 function test() {alert('123');} 为 什么不执行?
// eval(s) 的结果 test,即函数指针,要执行必须加上小括号!
eval(s)(); //123function test() {alert('123');}
var s = test;//test 代表一段可执行的代码 比较上面,用不用引号都一样!!
alert(eval(s));
// 弹出 function test() {alert('123');} 为 什么不执行?
// s 不是字符串,而是 函数指针 test,因此 eval(s) 就是 s,要执行必须加上小括号!
eval(s)(); // 123alert(test); // function test() {alert('123');}
test(); // 123
我感觉我今天踩上了JavaScript中最大的一颗地雷啊!!!
砰的一声,就把我炸得粉身碎骨了!!!
下面是我的一些测试结果,相信大家在看完以后
也会......
代码段1:eval参数不使用任何括号var s = "function test() {alert('123');}";
var f1=eval(s);
alert(f1);// IE:undefined&&&FF:一样
alert(test);//IE:function test() {alert('123');}&&&FF:一样
test(); // IE:123&&&FF:一样
代码段2:eval参数使用小括号var s = "function test() {alert('123');}";
var f2=eval('('+s+')');
alert(f2);// //IE:undefined&&&FF:有定义function test() {alert('123');}
alert(test);//IE:(function test() {alert('123');})两边加上了小括号&&&FF:无任何弹出窗口
test(); //IE:123&&&FF: 无任何弹出窗口代码段3:eval参数使用中括号var s = "function test() {alert('123');}";
var f3=eval('['+s+']');
alert(f3);// IE:&&&FF:都有定义function test() {alert('123');}
alert(test);//IE:function test() {alert('123');}&&&FF:无任何弹出窗口
test(); // IE:123&&&FF: 无任何弹出窗口代码段4:eval参数使用大括号var s = "function test() {alert('123');}";
var f4=eval('{'+s+'}');
alert(f4);// IE:undefined&&&FF:一样
alert(test);// IE:function test() {alert('123');}&&&FF:一样
test(); // IE:123&&&FF:一样我的测试环境为IE6和Firefox3.5.3
看来以后还是少用eval为好啊!!!
请大家务必谨慎使用eval!!!
而
eval('function a(){alert('ok');}');
a();//看看是什么效果,这就是你"无任何弹出窗口"的原因
请先看清楚我的测试结果!!!
像楼上这样eval("function a(){alert('ok');}");
然后执行
a(); //ok
两个浏览器都会弹出ok的。
还有楼上的引号匹配有点问题。
幸好今天又试了一下,不然一直错下去
http://topic.csdn.net/u/20091009/18/90f070dd-640b-4068-a62f-08a0c3fe6415.html
<script>
var a;
a = 1;alert(a);
</script>上面是最简单的代码了, 没有什么凝问修改一下,加对 {}<script>
{
var a;
a = 1;
}
alert(a);
</script>觉得这时候 { ... } 这里引擎要怎么解释呢
这时候 { ... } 跟 平时的 var xxx = { .... }; 不一样
这里的 { ... } 是语句块 block 跟出现在 while(*){...}; for(*){...}; if(*){...}else{...} 中的 {...} 是一样的
所以执行上面这段代码,结果跟第一段一模一样,不会有什么问题.再修改一下, 变成下面的样子<script>
{
prop1: var a;
prop2: a = 1;
}
alert(a);
</script>
是不是觉得,这代码会运行不了.
不是的,这代码,执行结果跟上面的又是一模一样.
javascript 支持标签语句的. 想起了么
loop1: for ( ... ) {
loop2: for( ... ) {
...
break loop1;
}
}
prop1 和 prop2 只充当 标签的作用而已
再改一下:<script>
{
prop1: 1,
prop2: 2
}
</script>符合 json 格式了, 引擎应该会把 { ... } 当成对象直接量了吧.
还不是, 引擎仍把 { ... } 当语句块了, 结果:语法错误,在 prop1: 1 后面缺少 ; 分号
那怎么样 才把 { ... } 当对象啊.
当语句运算需要取值的时候, 出现 { ... } , 引擎就把它当对象了.比如 : var xxx = { ... }; return { ... }; ({ ... }) 括号中的 数组元素定义中的{...} 实参列表中出现的{...} 等等
这时候, 你应该能明白为什么 eval(" { ... } "); 会取不到对象了吧, 是因为被当成语句块了.
而 eval("{ a: 111 }") 得到 '111' 就是 a: '111' 这个标签语句的值.
而 {...} 在 () 运算符中时,会当成对象, 所以 eval("({a:'111'})") 得到 object
而 [ ... ] , 这个很名显, 是数组定义.var s="{a:'111'}";
alert(s);
alert(typeof s);
// 上面三个不会有什么疑问吧var o=eval('['+s+']');
// 相当于 var o=eval(" [ { a:'111' } ] "); 没有意见吧
alert(s);//为什么是{a:'111'}而不是[object,Object]?
alert(typeof s);//为什么是string而不是object?
// s 都没改变过, 当然还是 字符串 "{a:'111'}" 了.alert(o);//为什么这里就是[object,Object]?
// o 就是 eval 出来的那个东东, 就是个数组来的呀, 数组当然就是 object 了.alert(typeof o);//为什么这里就是object?//不信的话, 还可以
alert(o[0]);
alert(typeof o[0]);
alert(o[0].a);
alert(typeof o[0].a);