Javascript 每日测试 - 第五期 callee及function
作者:grace 来源:gracecode.com 发布时间:2008-07-10 13:22:00
今天的问题是
请问以下 alert 弹出值分别是什么?
var f = function f2() {
return arguments.callee;
}
alert(f === f2);
alert(f === f());
alert(f() === f2());
让我们回顾 callee 的用法,Mozilla 官方的相关描述如下:
callee is a property of the arguments local variable availablewithin all function objects; callee as a property of Function.argumentsis no longer used. (Function.arguments itself is also deprecated.)arguments.callee allows anonymous functions to refer to themselves, which is necessary for recursive anonymous functions.The this keyword does not refer to the currently executing function. Use the callee property to refer to a function within the function body.
在 Javascript 中,一般定义某个函数有两种方式,分别是 function f() {...} 以及 var f = function () {...} 。同时,在 Javascript 中,函数可以当变量使用(Javascript 允许你结合两种方式使用,虽然这样的代码出现较少)。
var f = function f2() {
return arguments.callee;
}
上面的代码可以分解为
function f2() {
return arguments.callee;
}
var f = f2;
分解后的代码可以认为 f 与 f2 相同(==),但是进一步的理解他们并不完全相同(===)。调用 f() 与 f2() 执行获得的结果一样,“但 f2 这个变量保存了函数的整个内容,f 是对 f2 函数的引用” -- form 丁坚。
其实这样的写法很少见,并不推荐在实际的项目中这样编写。说完上面的问题,回到我们的题目中。从上面的 Mozilla 的说明中可得知,arguments.callee 引用的是当前正在执行的函数本身。
所以,由此可以推断 alert(f === f()); 返回的是true;同理 f2 === f2() 返回的也是 true 。f() 返回的就是 f, f2() 返回的就是 f2, 所以第三个 alert() 等同于第一个 alert() 语法, 返回的也是 false 。
所以,本日 Javascript 测试的答案为:false、true、false 。
那么 arguments.callee 有无实际的用途?回答是肯定的。在匿名函数用得越来越多的情况下,很多时候 arguments.callee 能帮上大忙。
比如,希望某事件只执行一次,那么可以这样做(使用 YUI 框架):
YAHOO.util.Event.on(button, 'click', function(ev) {
// ...
// 注销自己
YAHOO.util.Event.removeListener(button, 'click', arguments.callee);
});
YAHOO.util.Event.removeListener 的详细说明参见这里。我们给某个按钮注册了一个事件,时间处理器是一个匿名函数,点击一次以后,通过 removeListener 和 arguments.callee,就可以自我注销。
补充 -- form 玉伯
“也可以这样写就用不到 arguments.callee”,但这样代码感觉稍许冗余:
YAHOO.util.Event.on(button, 'click', function fn(ev) {
// ...
// 注销自己
YAHOO.util.Event.removeListener(button, 'click', fn);
});
其次,arguments.callee 还有一个重要的用途,就是在递归,比如:
function factorial(n) {
if (n <= 0) {
return 1;
} else {
return n * arguments.callee(n - 1);
}
}
参考资料:
--EOF--
猜你喜欢
- 我在一篇文章所说,首页的“站点名称”最好用h1标签来定义,但从美观考虑,要用logo图片来代替h1,这时需要隐藏h1内的这段文字,但又不能对
- 但是Class这个东西,如果用得比较少,充其量只是一个大模块的包装方式. 只有大规模地用它来开发,才能显出它对项目管理的优越性来. 所谓的意
- 笔者认为,在创建索引时要做到三个适当,即在适当的表上、适当的列上创建适当数量的索引。虽然这可以通过一句话来概括优化的索引的基本准则,但是要做
- 任何位置都能明确“我在哪里?这里有什么?从这里能去哪里?” 小时候,童话故事都告诉我们,迷路可不是一件好事。那会伴随着困惑、沮丧、
- 毫无疑问,这个世界设计无处不在,优美的设计会得到会心的微笑和由衷的赞赏。然而,想从事设计或在设计边缘的人们未必有机会学习专业的设计。实际上,
- //1、运行到C盘根目录 //2、输入:SET ORACLE_SID = 你的SID名称 3、输入:sqlplus/nolog 4、输入:c
- 译序:这篇文章是可用性大师 Jakob Nielsen 在10年前总结的,到今天仍然受用。通过这个时间跨度,可以得出,可用性话题不是某个时代
- 我们以用户查询语句为 https://www.aspxhome.com/chunfeng.asp为例来查询用户资料将从数据库Contact1
- 代码如下:Function getTreeRootId(pNodeId) getSQL = "select note_id,par
- 使用SQL Server事件探查器工具,你可用一个捕获到的跟踪来收集有关服务器的重要信息。与索引优化向导(Index Tuning Wiza
- 如果不是因为总监审查严格,一定要求这个细节解决掉,也许我也不会去深究根源性的解决办法,再此感谢MTIME负责而严格的同事。首先描述一下问题:
- b 和 i 标签在现在的 Web 标准潜规则中是不推荐使用,甚至是反对使用的,因为认为他们只是“表现”粗体和斜体,而没有任何“语义”。更多的
- 'subject 信息标题 'company 发布信息的公司名称 'cont
- 上次在“给网页添加打印按钮”一文中,有一段代码是“复制本文链接到剪贴板”js脚本,很可惜只能在IE中使用。这次在“淘宝网在线充值中心 - 荆
- 在今天的设计中,排版常常被忽视,特别是被网页设计师忽视。这真是件遗憾的事情因为CSS可以做很多事情来控制我们的排版。也就是说,我们被局限于某
- 要做好一个HTML邮件,说简单,还真不怎么复杂,说它复杂,其实也不难。-_-!!以前写过类似的[ 关于HTML邮件的总结 ],最近又犯愁,就
- 代码如下:--创建测试表 DECLARE @Users TABLE ( ID INT IDENTITY(1,1), UserIn
- 采集开始第一步是分析要采集的页面。使用浏览器打开要采集的页面(如:http://sports.sina.com.cn/k/2008-09-1
- ABS(x) 函数,此函数用来返回一个数的绝对值。 ACOS(x)函数,返回X的反余弦值。X范围从1到-1,输入值从0到派,以弧度为单位。
- 代码如下:--代码一DECLARE @cc INT SELECT NewsId,ROW_NUMBER() OVER(ORDER