美文网首页
一次函数调用带来的思考

一次函数调用带来的思考

作者: 毛贵军 | 来源:发表于2018-05-29 14:53 被阅读0次

    讲故事之前先给大家看个代码

      function con (a) {
        console.log(a)
      }12
    

    大家猜猜执行结果是什么?
    我们打开浏览器的控制台看看


    image.png

    是不是感觉很奇怪,这代码为什么得到这个结果?函数调用没见过这种形式呀?
    哈哈哈!其实这是一个障眼法因为这个方法根本没有调用,不信我们可以在控制台敲入12试试看


    image.png

    也会得到这个结果。

    今天为什么会想到这个,因为今天在看某个服务商提供的sdk的时候,看到一段很有意思的代码

      function t(t) {
      var o = new RegExp("(^|&)" + t + "=([^&]*)(&|$)", "i"),
        e = window.location.search.substr(1).match(o);
      return null != e ? decodeURIComponent(e[2]) : ""
    }(function () {
      for (var t = navigator.userAgent, o = ["Android", "iPhone",
          "iPad", "iPod"
        ], e = !0, n = 0; n < o.length; n++)
        if (t.indexOf(o[n]) > 0) {
          e = !1;
          break
        }
      return e
    })()
    

    因为是服务商提供的代码,所以没细看,下意识就认为应该是要实现这样的功能
    先执行自调函数

      (function () {
      for (var t = navigator.userAgent, o = ["Android", "iPhone",
          "iPad", "iPod"
        ], e = !0, n = 0; n < o.length; n++)
        if (t.indexOf(o[n]) > 0) {
          e = !1;
          break
        }
      return e
    })()
    

    然后把返回的值传给

     function t(t) {
      var o = new RegExp("(^|&)" + t + "=([^&]*)(&|$)", "i"),
        e = window.location.search.substr(1).match(o);
      return null != e ? decodeURIComponent(e[2]) : ""
    }(自调函数的值)
    

    我们先给他抽象一下

      function con (a) {
        return a && 2
      }(
        function() {
          return 1
        }
      )()
    

    那这种的其实就可以精简到我们文章开始的那种状态了

    function con (a) {
      return a && 2
    }1
    

    我们会发现最后得到的结果还是1,根本不会打印出2来。
    那有的观众可能会说,是不是要给1 加个()?
    我们给他加上一个括号试试看?

      function con (a) {
        return a && 2
      }(1)
    

    然后我们会发现这么写得到的结果还是1,因为js根本就没有

     function con (a) {
      return a && 2
    }(1)
    

    这种调用方式。这是一段错误的代码。

    如果是有函数名的函数就应该是下面这种

    function con (a) {
      return a && 2
    }
    con(1)
    

    如果是没有函数名的自调函数,那也应该是下面这种

    (function (a) {
      return a && 2
    })(1)
    

    所以最后会发现

      function t(t) {
        var o = new RegExp("(^|&)" + t + "=([^&]*)(&|$)", "i"),
          e = window.location.search.substr(1).match(o);
        return null != e ? decodeURIComponent(e[2]) : ""
      }(function () {
        for (var t = navigator.userAgent, o = ["Android", "iPhone",
            "iPad", "iPod"
          ], e = !0, n = 0; n < o.length; n++)
          if (t.indexOf(o[n]) > 0) {
            e = !1;
            break
          }
        return e
      })()
    

    这段代码四不像,完全达不到想要的效果。。。。。。

    相关文章

      网友评论

          本文标题:一次函数调用带来的思考

          本文链接:https://www.haomeiwen.com/subject/bqnojftx.html