网络编程
位置:首页>> 网络编程>> 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
投稿

猜你喜欢

  • 1.1.1 摘要 相信大家对于SQL Transcation再熟悉不过,它确保了数据库的数据一致性和安全性,尤其在对数据执行增删时,如果发生
  • 某天和一个产品经理聊起:以用户为中心是一个理想概念。经历了太多的项目,看到了太多的限制条件。而我向来不是一个有着设计洁癖的完美主义者。做为所
  • 今天终于抽出时间瞟了一眼JavaScript的新标准ECMA262v5,让我欣喜的是,不像是因为过于激进而被废除的v4,这个新标准对Java
  • SQL Server数据库查询速度慢的原因有很多,常见的有以下几种:1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)
  • 常用的四种SQL命令:1.查询数据记录(Select)语法:Select 字段串行 From table Where 字段=内容例
  • 索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型。在数据库表中,对字段建立
  • 无论安装何版本的mysql,在管理工具的服务中启动mysql服务时都会在中途报错。内容为:在 本地计算机 无法启动mysql服务 错误106
  • 由于众所周知的原因,ACCESS在大型站点应用中都靠不上边,主要问题就是数据量大了以后几乎无法索引。当ACCESS里数据过万后,明显可以感觉
  • 在CSS规范中有一个渲染对象的概念,通常用一个盒子(box, rectangle)来表示。mozilla通过一个叫frame的对象对盒子进行
  • 在安装好MYSQL ODBD的驱动程序后,应如何建立ASP文件连接数据库?我们有两种方法:一种是在ODBC数据源中建立一个DSN。具体方法是
  • 大家都知道连续的英文或数字能是容器被撑大,不能根据容器的大小自动换行,网页设计初学者可能不知道怎么处理,下面是CSS如何将他们换行的方法!对
  • JavaScript中的64位加密及解密的两个方法。function base64Encode(text){if (/(
  • 备注: 关于label和tag,在中文中都翻译成标签,而下文中出现的标签,都是对label的翻译,比如”用户名”+输入框, 这里的”用户名”
  • 经常看到说正则的文章,但说的只是方法,却很少有说以下几个基本概念: 1.贪婪:+,*,?,{m,n}等默认是贪婪匹配,即尽可能多匹配,也叫最
  • 数字函数 ABS():求绝对值。 CEILING():舍入到最大整数。 FLOOR():舍入到最小整数。 ROUND():四舍五入 ROUN
  • 假设你想找到本书中的某一个句子。你可以一页一页地逐页搜索,但这会花很多时间。而通过使用本书的索引,你可以很快地找到你要搜索的主题。表的索引与
  • 第一种方法:  代码如下:/* 创建链接服务器 */ exec sp_addlinkedserver 'srv_lnk&#
  • 一个SELECT查询中的LIKE语句来执行这种查询,尽管这种方法可行,但对于全文查找而言,这是一种效率极端低下的方法,尤其在处理大量数据的时
  • 内容摘要:最近逛论坛经常看到有朋友问上传文件怎么重命名,怎么以当前日期来重命名上传文件。现在我就介绍一下重命名的方法,希望对大家有所帮助。本
  • Mysql数据库是一个多用户,多线程的关系型数据库,是一个客户机/服务器结构的应用程序。它是对个人用户和商业用户是免费的.Mysql数据库具
手机版 网络编程 asp之家 www.aspxhome.com