缺少分号导致IIFE失效

正文

先来看这两段代码, 执行之后可以看到控制台爆出log.(...) is not a function的错误异常信息。

1
2
3
4
5
6
7
8
9
10
11
12
window.onerror = undefined;
// 1. 执行错误
$(function () {
console.log(" 测试1")
(function () { alert("测试哈哈哈"); })();
});

// 2. 正确执行
$(function () {
console.log(" 测试1");
(function () { alert("测试哈哈哈"); })();
});

万物皆对象, 函数也是对象。
所以函数也可以返回函数, 做到fun(arg1)(arg2)(arg3)这种奇葩的语法。

我们再把第一种缺少分号的函数换个写法, 这两种写法是等价的。

1
2
3
4
5
6
7
8
$(function () {
// 1. 原代码
console.log(" 测试1")
(function () { alert("测试哈哈哈"); })();

// 2. 换种写法, 类似于`fun(arg1)(arg2)(arg3)`
console.log(" 测试1")(function () { alert("测试哈哈哈"); })();
});

我们预想的执行方式截然不同。console.log()和匿名函数变成了一条语句。
即使是使用了'use strict';也不会在写代码的时候报错。
所以不要太过于依赖没有分号。

结合window.onerror造成更大杀伤力

第一行我加上了window.onerror = undefined;
因为项目上使用了开普云的一个js脚本。

1
<script type="text/javascript" charset="utf-8" id="kpyfx_js_id_10000077" src="//fxsjcj.kaipuyun.cn/count/10000077/10000077.js"></script>

这个js没有详细去看, 因为压缩混淆过了。
但是我知道的是, 它拦截了异常报错信息, 导致控制台无法正常提示错误, 拖住我好久(生气

1
2
3
4
window.onerror = function(url, error, line, column) {
_$xerrorcode = "msg[" + url + "]#line[" + line + "]#column[" + column + "]";
return true;
};

所以我在第一行加上了window.onerror = undefined;(或者null)。
因为我在浏览器控制台输入window.onerror, 返回的是null