首先,我引用一个 testFunction.js 的文件,里面的代码如下:
function shallwego() {
return true
}
function gotopage1() {
if (shallwego) {
window.location = "http://www.jianshu.com/p/dc062dd46e17"
}
}
gotopage1();
function gotopage2() {
m += 1;
}
gotopage2();
然后我在 html 文件( index.html )当中,引入上述 js 文件,代码如下:
<script src="../js/testFunction.js"></script>
然后文件的相对位置给你展示一下:
文件相对位置
看到这里,我想问你一个问题,如果我打开 index.html,结果会是什么样的呢?
先猜一下,不要说出来,
然后看下图,看看和你想的结果是不是一样的呢?
为了方便打开页面,我直接在网址中输入本地文件的地址:
http://localhost:63342/learnnode/html/index.html?_ijt=alk3vcpo52stc41djq106cpn51
咦?控制台好像有一个错误?看不清?
放大来看一些:
错误报告
你可能会有疑问了,这不是 js 文件中关于第三个函数的报错吗?
可是我明明在第二个函数调用的时候,
就已经通过 window.location 跳转到其他页面了呀,
怎么会继续执行原来 js 文件里面的函数呢?
你可能想当然的以为,第三个函数不会执行,而是第二个函数执行完了之后,直接 window.location = "…"就跳转走了。
但是实际上,在引用 js 文件的时候,你可以把它理解成,这个 js 文件相当于一个大的函数,不过,这个函数没办法 return。 所以,在执行引用的 js 文件的时候,他不会看你其中的某个函数是否会有类似于中断的功能(例如,window.location = “…”)。
他会一次性把所有的函数都过一遍之后,再执行其中的某个函数。
这就是为什么,明明在 js 文件中第二个函数是跳转,反而第三个函数也会「执行」,导致报错的根本原因。
那么,知道了问题出在了哪里,该如何解决呢?
第一种方法:拆分成两部分,然后放到两个 js 文件中。如下图:
方法一
我们再到浏览器中看一下,看看控制台这次会不会报错:
怎么样?是不是好了呢?
我们再来看第二种方法:
我们可以通过判断语句来达到类似于「控制代码执行」的作用,代码如下:
function shallwego() {
return true
}
function gotopage1() {
if (shallwego) {
window.location = "http://www.jianshu.com/p/dc062dd46e17"
}
}
if (true) {
gotopage1()
} else {
function gotopage2() {
m += 1;
}
gotopage2()
}
效果也是一样的,你可以试一下。我这边就不附图了~
方法三:借用立即执行函数
function shallwego() {
return true
}
(function() {
if (shallwego) {
window.location = "http://www.jianshu.com/p/dc062dd46e17"
}
}());
function gotopage2() {
m += 1;
}
gotopage2();
立即执行函数的好处是,可以在函数创建完之后就立刻调用。
不过我在实际使用的时候,发现并没有解决问题,报错还是一样出现:
错误好像还没有消失
可能是我的写法不对,
我有时间的话会研究一下关于立即执行函数有关的知识。
最后,欢迎优秀的你给我提出宝贵的意见和建议。
我会不断的坚持,将自己打磨的越来越优秀。
网友评论