V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
xxxpara
V2EX  ›  JavaScript

不使用全局变量如何定义一个 count()每次调用输出第几次调用?

  •  
  •   xxxpara · 2015-08-17 21:13:39 +08:00 · 2914 次点击
    这是一个创建于 3389 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一道面试题,这个要怎么做?

    10 条回复    2015-08-18 15:08:07 +08:00
    ChefIsAwesome
        1
    ChefIsAwesome  
       2015-08-17 21:17:45 +08:00 via Android
    闭包。写个会返回另外一个函数的函数就完事了
    aivier
        2
    aivier  
       2015-08-17 21:19:31 +08:00
    如果没有 Cookie 和 LocalStorage ,也没有 HTML ,还不能和服务器通讯

    ....我想不出来
    est
        3
    est  
       2015-08-17 21:21:36 +08:00
    函数也算全局变量?
    magicdawn
        4
    magicdawn  
       2015-08-17 21:24:08 +08:00
    function count (){
    console.log (++count.count );
    }

    count.count = 0;

    函数也是可以带属性的,闭包就不说了
    Gonster
        5
    Gonster  
       2015-08-17 21:24:26 +08:00 via iPhone
    var count = (function (){
    var i = 0;
    return function (){console.log (++i )}
    })();
    yangg
        6
    yangg  
       2015-08-17 21:35:50 +08:00
    console.count ();
    ChefIsAwesome
        7
    ChefIsAwesome  
       2015-08-17 21:50:34 +08:00 via Android
    稍微扩展一下。 jQuery 的$是什么,$.ajax 是什么,$.fn 又是什么。
    js 基本原理就这些东西了
    zhuangzhuang1988
        8
    zhuangzhuang1988  
       2015-08-18 08:55:28 +08:00
    简单,定义类啊
    an168bang521
        9
    an168bang521  
       2015-08-18 14:57:22 +08:00
    哥们,这题应该是考查对闭包内的变量控制的;
    可以下面这么写的,
    <script>
    function test (){
    var i=1;
    return function (){
    console.log ("这是您第 "+(i++)+" 次调用 count ()")
    };
    }
    count=test ();
    count ();
    count ();
    count ();
    count ();
    count ();
    count ();
    </script>
    这个在写 JS 时候很常用的;
    还有 4 楼说的添加自定义属性也经常用的,尤其的做定时器 /动画的时候;
    an168bang521
        10
    an168bang521  
       2015-08-18 15:08:07 +08:00
    闭包和给函数添加自定义属性都可以;
    但是给函数添加自定义属性,在性能上会更好;
    因为这里用闭包实现的话。产生的作用域不销毁;
    性能不如下面这种添加自定义属性的好
    function count2 (){
    console.log ("这是您第 "+(++count2.count )+" 次调用 count2 ()");
    }
    count2.count = 0;
    count2 ();
    count2 ();
    count2 ();
    count2 ();
    count2 ();
    count2 ();
    这种实现方法比闭包,在性能上好些;
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3643 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 04:27 · PVG 12:27 · LAX 20:27 · JFK 23:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.