讲故事之前先给大家看个代码
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
})()
这段代码四不像,完全达不到想要的效果。。。。。。
网友评论