V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
andybest
V2EX  ›  问与答

[JavaScript] 判断 if(function(){}) 什么意思?有什么用?

  •  
  •   andybest · 2013-05-30 13:24:10 +08:00 · 3868 次点击
    这是一个创建于 4201 天前的主题,其中的信息可能已经有所发展或是发生改变。
    看到一代码,无覆盖载入window.onload:
    windows.onload = function(){
    alert(1);
    }
    windows.onload = (window.onload||function(){}).after(function(){
    alert(2);
    })


    第二个逻辑里的:
    windows.onload = (window.onload||function(){})...

    这里为什么要判断function(){}?这个是什么意思?什么情况下会返回false?
    12 条回复    1970-01-01 08:00:00 +08:00
    chuhades
        1
    chuhades  
       2013-05-30 13:29:16 +08:00   ❤️ 1
    js 不是懂太多...
    这个的意思应该是如果window.onload 不为空就把window.onload 赋给window.onload,
    如果为空就把一个空的function 赋给window.onload。
    andybest
        2
    andybest  
    OP
       2013-05-30 13:30:17 +08:00
    @chuhades 不是吧? || 是或的意思啊
    Mutoo
        3
    Mutoo  
       2013-05-30 13:31:53 +08:00   ❤️ 1
    好眼熟,这不是腾讯前端发的那个日志吗……

    1) 在javascript里 0, null, undefined 都返回false

    2) || 条件语句返回从左往右第一个不为false的对象

    所以 windows.onload = (window.onload||function(){}) 的意思是:如果window.onload未定义,就取 function(){} (空函数)
    chuhades
        4
    chuhades  
       2013-05-30 13:32:20 +08:00
    @andybest 你可以测试下:
    var a;
    b = (a || function(){alert(1)})
    b()
    chuhades
        5
    chuhades  
       2013-05-30 13:33:32 +08:00
    3 楼很详细~
    andybest
        6
    andybest  
    OP
       2013-05-30 13:43:59 +08:00
    @Mutoo
    @chuhades

    谢谢,是我理解错了,原来在javascript里:

    v = (a||b);
    与:
    v =(a?a:b);

    这两行执行结果是一样的?
    Mutoo
        7
    Mutoo  
       2013-05-30 13:45:01 +08:00   ❤️ 1
    @andybest 哈哈,js里面,还有呢,取两数较小数可以这样写 a<b&&a||b
    zhttty
        8
    zhttty  
       2013-05-30 13:49:15 +08:00
    首先你得windows是错的;
    改了window则返回1;
    andybest
        9
    andybest  
    OP
       2013-05-30 14:07:59 +08:00
    @Mutoo 这种写法真是反人类啊
    reyrey
        10
    reyrey  
       2013-05-30 18:25:23 +08:00
    那为什么后面缀上.after 啥的
    ijse
        11
    ijse  
       2013-05-30 18:52:40 +08:00
    嗯,, 前端 AOP。

    把window.onload赋值为function(){}, 是为了使用之前添加到Function.prototype的before(), after()
    chrisyipw
        12
    chrisyipw  
       2013-05-30 19:51:40 +08:00
    @andybest 虽然不好理解,但是习惯了觉得写起来很爽,不需要跟着规章制度走。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2793 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 14:52 · PVG 22:52 · LAX 06:52 · JFK 09:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.