• 匿名函数function前面的! ~等符号作用小解


    相信昨晚前端,很多同学应该都见过类似于:

    !function() {do something...}()
    ~function(){do something...}()

    等这样的匿名函数写法!

    当然对于老同志来说,肯定是明白这样写法的作用了,但是对于新手来说可能会有一定的困扰,这里就简单给大家分享一下关于这种写法的作用,以及原理!

    众所周知,在js中可以这样创建一个匿名函数:

    (function(){do something...})()
    //
    (function(){do something...}())

    而匿名函数后面的小括号()是为了让匿名函数立即执行,其实就是一个函数调用,相信大家都懂的!

    那大家有没有想过为什么这么写就会报错了:

    function(){alert(1)}()

    其实很简单,因为function前面没有(或者! ~之类的运算符,js解析器会试图将关键字function解析成函数声明语句,而不是函数定义表达式!

    作为组运算符,小括号()会将其内部的表达式当成一个整体,然后返回结果,所以定义一个匿名函数正确的格式就是用小括号将函数体括起来!

    同样的! ~ + -等运算符也有同样的效果,这是因为匿名函数也是一种值,这些运算符会将后面的函数体当成一个整体,先对匿名函数进行求值,然后在对结果进行运算!

    不过这些运算符虽然能够达到让匿名函数立即执行的目的,但是要小心他们是有副作用的,比如:

    !function() {return 1}()//false
    ~function() {return 1}()//-2
    -function() {return false}()//0
    -function() {return false}()//0

    没错,他们会对函数的返回值进行运算,这样可能会导致最终的结果和你想要的结果不一样!当然,对于那些没有返回值的函数来说,当然是没有什么影响了!

    当然一般这么用的时候都是函数本身没有返回值的情况!(还有可能会有一些特殊的需求啦),为了代码可读性,本人建议还是按照正规的方式使用匿名函数,没有特殊需求的情况下尽量不用这些运算符代替小括号!

  • 相关阅读:
    我的Ajax之旅(一):不能加载'AjaxControlToolkit'。。。拒绝访问
    网络编程(一):用C#下载网络文件的2种方法
    Locks
    Threads
    C语言中函数名和struct名可以重名!
    使用#include <pthread.h>
    APUE Chapter 7 (2)main函数的参数
    Creating a shared and static library with the gnu compiler [gcc][转]
    Signals
    APUE Chapter 7(3) – Memory layout of a C program
  • 原文地址:https://www.cnblogs.com/itgezhu/p/11589839.html
Copyright © 2020-2023  润新知