网络编程
位置:首页>> 网络编程>> JavaScript>> 一段有趣的js代码的研究

一段有趣的js代码的研究

作者:yemoo 来源:AJAXBBS.NET 发布时间:2008-04-29 21:47:00 

标签:代码,with,bind,函数,js

近日在月影的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,是不会返回的。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com