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--

标签:callee,function,javascript
0
投稿

猜你喜欢

  • 中秋阴天看不见月亮只好用python写赏月工具

    2021-02-09 17:54:24
  • 详解Python字符串原理与使用的深度总结

    2021-09-17 17:31:14
  • SQL Server服务器内存升级后的烦恼

    2008-12-22 10:55:00
  • Python合并pdf文件的工具

    2021-09-09 23:28:47
  • FileUpload上传图片预览不变形

    2010-08-05 21:25:00
  • 完美解决mysql启动后随即关闭的问题(ibdata1文件损坏导致)

    2024-01-12 14:43:03
  • Js通过AES加密后PHP用Openssl解密的方法

    2023-07-17 08:04:42
  • TensorFlow 模型载入方法汇总(小结)

    2022-11-09 00:05:42
  • python星号(*)和双星号(**) 函数动态参数匹配及解包操作方法

    2023-04-09 19:55:03
  • JDBC连接集群数据库的方法

    2024-01-24 14:29:57
  • 使用Python爬虫爬取小红书完完整整的全过程

    2022-03-23 05:12:44
  • Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项

    2021-11-15 18:53:31
  • ML神器:sklearn的快速使用及入门

    2023-04-17 04:42:09
  • mysql8.0.11客户端无法登陆的解决方法

    2024-01-17 18:57:52
  • mysql实现从导出数据的sql文件中只导入指定的一个表

    2024-01-13 11:43:54
  • Javascript动态伸缩+淡出淡入

    2024-06-22 02:57:21
  • MVC4制作网站教程第二章 用户注册2.1

    2023-06-28 12:33:36
  • pytest中文文档之编写断言

    2023-05-05 04:11:34
  • python 获取et和excel的版本号

    2022-05-03 09:24:51
  • MyBatis 如何写配置文件和简单使用

    2024-01-26 08:01:18
  • asp之家 网络编程 m.aspxhome.com