Ghost全自动系统备份光盘正式版 V4.5 | 硬盘版 V2.0 | 排行榜 TOP50 | 图文推荐 | 玩小游戏
首页 >> JavaScript >> Js高级编程 >> 一段有趣的js代码的研究

一段有趣的js代码的研究

作者:yemoo 来源:AJAXBBS.NET 时间:2008-4-29 网友评论条 【

近日在月影的blog上找到一段代码。看了老半天没明白什么意思,倍受打击!不死心,于是仔细分析思考了好几次,才明白过来这段函数的意义。js果然是妙啊!!有兴趣的可以研究下!

代码如下:


<script>
Function.prototype.$bind=function(object)
{
var callback = function () {
   return arguments[0];
}
with(object)
{
   return eval('callback(' + this.toString() + ')');
}
}

var obj={a:1,b:2};
var f=function (){
a=10;
b=11;
}.$bind(obj);

f();
alert(obj.a);
</script>

猜猜运行结果是什么,为什么?

下面给出网友bean的分析解答:

就算猜也猜到是10了吧~

试着尝试说下原理:

this.toString()返回的是函数体,在例子中也就是

function (){
a=10;
b=11;
}

在bind方法中使用了with,则把指针指向了object,而不是window,这时候调用a = 10实际上是object.a = 10;

开始我觉得callback多此一举,直接使用eval(this.toString());就可以,不过在IE下报错,在FF下是可以得到正确结果的。

那么这callback就是用来解决ie下报错的问题。

检查了半天才发现报错是因为bind以后并没有返回一个function,callback就是把这个function返回。

得到猜想:在IE下调用eval,不调用return,不会有返回值。而FF下,默认会返回最后的结果。

那么开始证明这个猜想:

调用:

alert(eval('333'));

都会弹出333

调用:

eval('function(){alert(3)}')()

IE下报错,FF下会弹出3。

调用:

alert(eval('function(){alert(3)};a = 3'));

IE下FF下都会弹出3,FF下弹出3.

所以说明上面的猜想是错误的。

也就是IE下调用eval的时候,普通的表达式则会返回,若得到一个function,是不会返回的。

站长工具
关键字排名查询:关键字 网址
相关文章
loading 请稍等,评论加载中...

Aspxhome.com. 中国Asp之家. 版权所有

闽ICP备06017341号