在Ajax BBS上看到了這么一段代碼:
<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>
結果為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,是不會返回的。