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--
猜你喜欢
- python实现简单神经网络算法,供大家参考,具体内容如下python实现二层神经网络包括输入层和输出层import numpy as np
- 今天要实现的功能就是以下这个功能:vue.js模拟日历插件好了废话不多说了 直接上代码了css:*{ margi
- 如下所示:import numpy as npnp.set_printoptions(threshold='nan')来源:
- 一、数据库远程管理技术 对于中小型应用,比如一个网站的建设和维护,这种大型应用平台就显得有些尾大不掉,开销也过于庞大。曾经在互联网技术和Ja
- 如下所示:# coding=utf-8# 用来处理数字,大于上限的数字置零f = open("/home/chuwei/桌面/tr
- 目前广泛使用的图像分类数据集之一是MNIST数据集。如今,MNIST数据集更像是一个健全的检查,而不是一个基准。为了提高难度,我们将在接下来
- 0.背景在游戏的UI中,往往会出现这样的情况:在某个战斗副本中获得了某个道具A,那么当进入主界面的时候,你会看到你的背包UI上有个小红点(意
- 1.在百度地图申请密钥: http://lbsyun.baidu.com/ 将<script type="tex
- 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。
- 本文实例为大家分享了vue仿写下拉菜单功能,带有过渡效果(移动端),供大家参考,具体内容如下效果图clickOutside.js 点击目标之
- 本文实例为大家分享了用matplotlib中scatter方法画散点图的具体代码,供大家参考,具体内容如下1、最简单的绘制方式绘制散点图是数
- 智能合约1. 是什么智能合约是一种由计算机程序编写的自动化合约,它可以在没有第三方干预的情况下执行交易和契约条款。智能合约使用区块链技术实现
- 最近做了一些小程序方面的性能优化,如分包加载,添加骨架屏等,这次主要说一下骨架屏的相关内容。关于骨架屏,有三种方法:1.直接请UI同学帮忙P
- 科讯5.0 标签和之前版本变化不大,如果用老版本的科讯,可以参考这个标签使用。相关文章:新云4.0 模板通用标签说明 标签清单:======
- 昨天我只是将数据库附加到SQL2012,然后各个数据库都做了收缩事务日志的操作兼容级别这些都没有改再附加回SQL2005的时候就报错在SQL
- 项目开始时是一个关键时刻,选择会对项目产生长期的影响。有很多关于如何开始使用Django框架的教程,但很少讨论如何专业地使用Django,或
- 获取百度的歌曲名,歌手和链接!! package webTools; import java.io.BufferedReader; impo
- <!-- -----------[test]表生成脚本---------------
- Timer继承子Thread类,是Thread的子类,也是线程类,具有线程的能力和特征。这个类用来定义多久执行一个函数。它的实例是能够延迟执
- 方法对比:使用df[(df[“a”] > 3) & (df[“b&