一次函数调用带来的思考

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

  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
  })()

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容