Logo

never-online

A crisis is a terrible thing to waste.
  • Blog首页
  • 推荐日志
  • 关于我
  • 留言簿
  • 设计
  • 订阅RSS
  • 登录
« JavaScript王者归来
Javasript 构造stati... »
分类: Web Dev
推荐日志

eval解闭包

[ 2008-07-02 13:18:18 | 作者: Rank ]
字体大小: 大 | 中 | 小
Close Advertisement
"private"在js里通常是这样写:
Copy Code(拷贝代码)-Run HTML(运行代码)-Save Code(另存代码)
<script type="text/javascript">
//<![CDATA[
  var obj = (function () {
    var p = 'http://www.never-online.net';
    return {
      show: function() {
        alert(p);
      }
    }
  })();

  obj.show(); //http://www.never-online.net
  alert(obj.p); //undefined;
//]]>
</script>

以为上面的private变量会万无一失吗?如果你真的那样想,那么在下面的代码里,会让你大跌眼镜。在 firefox 里可以解开上面的闭包,答案是用eval
Copy Code(拷贝代码)-Run HTML(运行代码)-Save Code(另存代码)
<script type="text/javascript">
//<![CDATA[
  var obj = (function () {
    var p = 'http://www.never-online.net';
    return {
      show: function() {
        alert(p);
      }
    }
  })();

  obj.show(); //http://www.never-online.net
  eval('p="eval you"', obj.show);
  obj.show(); //eval you
//]]>
</script>

是否觉得不得思议?eval是不是太不安全了,:),且看mozilla的官方文档是怎么说的。以下是我截取的重点的部分
引用
[edit] Syntax
eval(string [, object])

[edit] Parameters
string
A string representing a JavaScript expression, statement, or sequence of statements. The expression can include variables and properties of existing objects.
object
Non-standard
An optional argument; if specified, the evaluation is restricted to the context of the specified object.
即eval的第二个参数是指定一个上下文作用域。

请再看下面一段
引用
Don't use eval!
eval() is a dangerous function, which executes the code it's passed with the privileges of the caller. If you run eval() with a string that could be affected by a malicious party, you may end up running malicious code on the user's machine with the permissions of your webpage / extension.

There are safe alternatives to eval() for common use-cases.
从这一段,我们可以看到mozilla是如何解释eval的危险的。说一下我的看法:

对于eval,我们尽量少用,而且不用。如果要用,我会用在json的序列化和反序列化上。其它地方,能不用就不用。因为eval不光可以写,当然也可以读了,所以你整个代码对于eval来说都是可见的,没有了作用域,这就乱了 [rolleyes]
[最后修改由 Rank, 于 2008-07-02 13:17:58]
评论Feed 评论Feed: http://www.never-online.net/blog/feed.asp?q=comment&id=224

浏览模式: 显示全部 | 评论: 9 | 引用: 0 | 排序 | 浏览: 2942
引用 muxrwc
[ 2008-07-02 10:17:26 ]
[lol] 这样的eval真美丽。。。
貌似早版的FF,还有object.eval
现在的貌似没了。。。 [lol]
引用 Rank
[ 2008-07-02 12:06:09 ]
是在1.0||1.2版本上才有object.eval。且mozilla官方说(不知道是不是出了新版才改的口)。object.eval已经被全局函数eval取代,不建议用object.eval
引用 muxrwc
[ 2008-07-02 12:45:58 ]
噢。。。。我说呢。。。
搜__parent__时,见到不少有用object.eval方法的。。。 [lol]
引用 winter*
[ 2008-07-02 12:48:13 ]
其实我觉得作用域这种东西是防止程序员不小心犯错误的 如果这样处心积虑地想要访问closure里的内容那也没办法啦
就像C++的private对象还可以指针运算修改呢
甚至C++的引用也是可以通过指针运算算出位置来修改的

FF一个非常别扭的做法是[[scope]]的优化 本来不止是函数 任何对象都可以这样做的 但是FF会把所有没用的(它认为没用的)[[scope]]给window
所以事情便乱了套
引用 Rank
[ 2008-07-02 15:51:27 ]
FF一个非常别扭的做法是[[scope]]的优化 本来不止是函数 任何对象都可以这样做的 但是FF会把所有没用的(它认为没用的)[[scope]]给window
所以事情便乱了套
---------
IE也有类似的机制呀,所有无主的东西都给宿主window
引用 winter*
[ 2008-07-04 11:13:50 ]
不是啊 IE那是另一回事 乱改scope很讨厌的
引用 Rank
[ 2008-07-06 13:34:08 ]
我被[[scope]]打败了。。。 [rolleyes]
引用 dh20156*
[ 2008-07-28 11:38:42 ]
引用至 Rank
FF一个非常别扭的做法是[[scope]]的优化 本来不止是函数 任何对象都可以这样做的 但是FF会把所有没用的(它认为没用的)[[scope]]给window
所以事情便乱了套
---------
IE也有类似的机制呀,所有无主的东西都给宿主window
winter講的是沒有引用的作用域會被FF Clear的那段。 [lol]
引用 rand*
[ 2009-10-31 15:00:57 ]
[cry]

发表
表情图标
[smile] [confused] [cool] [cry]
[eek] [angry] [wink] [sweat]
[lol] [stun] [razz] [redface]
[rolleyes] [sad] [yes] [no]
[heart] [star] [music] [idea]
UBB代码
转换链接
表情图标
悄悄话
昵        称:  3-24字符, 不可使用特殊字符 *
安全规则: 请输入规则答案: 2+5=? *
 
Language Package
  • ENGLISH
  • 简体中文
用户面板
用户名:
密码:
安全规则: 2+5=?
注册
分类
  • Blog首页
  • Android [2] Android RSS Feed
  • Diary & Misc [115] Diary & Misc RSS Feed
  • Web Dev [108] Web Dev RSS Feed
  • Never Modules(JS) [12] Never Modules(JS) RSS Feed
  • Flash & Flex & Air [4] Flash & Flex & Air RSS Feed
  • PHP & Apache [1] PHP & Apache RSS Feed
  • XML [7] XML RSS Feed
  • CSS [7] CSS RSS Feed
  • ASP & .NET [3] ASP & .NET RSS Feed
  • Literature Archives [4] Literature Archives RSS Feed
  • Design [17] Design RSS Feed
  • Visual Basic [3] Visual Basic RSS Feed
最新评论
  • @gzman 那阵子确实想蛮多...
  • 兄弟,想太多了吧
  • [smile] [wink] [sweat] ...
  • javascript:insertSmilie...
  • 我新建了两个sliderbar都...
  • 不错哦````````
  • 好文,收藏至20ju.com
  • @aflyhorse 我这里没有实...
  • 我上次找了一个识别效果...
  • 第一个实例我只看见了doe...
  • 好文啊,只是我阅读太慢...
  • 其实用<iframe src="java...
  • 还没到那个境界。
  • @tokki 要造也应该造车,...
  • 能不造轮子的程序员太少...
搜索

统计数据
日志: 283
评论: 845
引用: 0
用户: 115
到访: 4059703
在线: 1

新浪微博
Links
  • Zerray
  • realdodo
  • ps album
  • my flickr
  • XiaoFeng
  • 神~ORZ
  • Jiuan's blog
  • yanpeng's blog
  • zhoux's blog
  • winter
  • aoao
  • jerry.qu
  • JoelLeung
  • monyer
  • Miller
  • PuterJam
  • Terry
  • JK
  • akira
  • dh20156's New World!
  • muxrwc
  • Joshua
  • Estyle
  • 互联网人
  • 兔子
  • 电脑爱好者
  • 阿笨狗
Favorite
  • leica china
  • Douglas Crockford
  • dhteumeuleu
  • regexplib
  • webfx
  • ajaxian
  • John Resig
  • dean
  • Adam McCrea
  • css beauty
  • livepipe
  • smashing magazine
  • ericlippert
  • narcissus
  • PPK
widget

Powered by LBS Version 2.0.304 © 2003-2005 SiC/CYAN. - Template writen by never-online - 桂ICP备07010684号
17 DB Queries | Proccessed in 125ms