一段有趣的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,是不会返回的。


猜你喜欢
- 安装PandasPandas是构建在Python编程语言之上的一个快速、强大、灵活且易于使用的开源数据分析和操作工具。Pandas是基于Nu
- 其实老早之前就已经做完了,这次稍微改进一下浏览地址:http://www.healdream.com/upload/html/autocli
- 前言博主参与过大大小小十次数学建模比赛,也获得了不少建模奖项。对于一些小批量样本数据去做预测或者是评估其规律性的话,比较适合的模型一般都是选
- 下面是BeforeInitialBind事件过程:<SCRIPT language=vbscript event=
- 几乎所有的微薄都提供了缩短网址的服务,其原理就是将一个url地址按照一定的算法生成一段字符串,然后加在一个短域名后面边成了一个新的url地址
- 本文实例为大家分享了wxPython色环电阻计算器的具体代码,供大家参考,具体内容如下import wx # 导入wxPythonclass
- 1、PIL介绍以及图片分割Python 3 安装: pip3 install Pillow1.1 image 模块Image模块
- 首先要注册一个账号密码,通过账号密码登录,并且滑块验证,自动输入搜索关键词,进行跳转翻页爬取数据,并保存到Excel文件中。代码运行时,滑块
- 前言本篇来学习pytest中内置fixture中临时目录的使用tmpdirtmpdir作用范围是函数级别,创建临时文件供单个测试点调用# -
- 看看上一篇《javascript设计模式交流(一)Singleton Pattern》本文将讨论Prototype Pattern的js实现
- 一、php事务处理概述:事务:是若干事件的集合事务处理:当所有事件执行成功,事务才执行;若有任何一个事件不能成功执行,事务的其它事件也不被执
- 本文实例讲述了js中火星坐标、百度坐标、WGS84坐标转换实现方法。分享给大家供大家参考,具体如下://定义一些常量var x_PI = 3
- 一、数据库的操作1、新建数据库2、打开数据库右键或者双击就可以了。3、删除数据库右键–>删除数据库4、修改数据库右键–>数据库属
- memcached是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但被许多网站使用。这是一套开放
- 1、主动删除对象调用del 对象;程序运行结束后,python也会自动进行删除其他的对象。class Animal: &nbs
- 在Python中,变量是没有类型的,这和以往看到的大部分编辑语言都不一样。在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可。但是,
- 本文实例讲述了golang实现http服务器处理静态文件的方法。分享给大家供大家参考,具体如下:新版本更精简:package mainimp
- 匿名函数什么是匿名函数用一句话表达只有返回值的函数就是匿名函数。匿名函数只用来实现一些简单的函数功能,所以追求代码的简洁和高效。使用关键字
- 一、匹配版本基于Camunda 7.16.0 + Springboot 2.5.8首先我们去官网找到camunda7.16对应的spring
- BeautifulSoup是Python的一个第三方库,可用于帮助解析html/XML等内容,以抓取特定的网页信息。目前最新的是