为什么Javascript内部/外部文件中的错误也会停止下面的代码?

时间:2014-08-11 10:45:23

标签: javascript compiler-errors runtime-error

JavaScript内部/外部文件中的错误也会停止以下代码

例如:

var myObj = {};
myObj.other.getName = function(){
  console.log('other is not defined');
};
alert('this will not show');

在上面的代码中,警报将不会出现,因为上面的代码有错误。

我在一个文件tst1.js中添加了相同的代码,然后在其中添加了一个文件tst2.js.alert('in tst2.js')放入其中。 tst2警报来了,而tst1没有。它是一些与之相关的东西 代码编译/解释。

非常感谢如果有人向我解释这种行为:)

2 个答案:

答案 0 :(得分:0)

这是JavaScript的默认行为。避免错误,代码将正常运行。 您也可以使用try...catch处理错误:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch

答案 1 :(得分:0)

所有JS实现都是AFAIK,单线程。这意味着所有代码都是在一个线程上(逻辑上)顺序执行的。如果这个线程遇到致命错误,它就会停止运行。忽略发生错误的点之后的所有代码(JS引擎停止,不再进行任何工作) 澄清:你有多少文件并不重要。所有JS代码都被串联成一个大脚本,这个脚本按顺序执行(执行点从第一个脚本的第1行开始,到最后一个脚本的最后一行结束)。该代码中的任何错误都将导致整个执行停止:

//file1.js
var foo = (function()
{
    console.log('This file is flawless, but pointless');
}());
//file2.js
foo();//calls previously defined function, assigned to var foo
//file3.js
fudhfsiufhi;//ERROR
//file4.js
foo();//will never get executed, because an error occurred in file3.js

删除file3,或者确实修复错误,一切都会按预期工作 尽管JS代码是按顺序执行/评估的,但事件处理程序,回调,间隔和超时可能会让您相信其他情况。再加上你有某些控制执行什么代码的事实,而不是完全控制,并且你得到的情况一开始看起来相当直观。考虑一下:

setTimeout(function()
{
    massive(syntaxError) -123 + "here";
},0);//zero MS
alert('This will show');

这种奇怪之处已有详细记载,但它与JS有一个回调/处理程序循环和队列有关。 setTimeout设置超时,以0ms(立即)调用匿名函数,但该回调被发送到队列,该队列定期检查。在检查队列(并调用回调)之前,将显示警报。这就是为什么您传递给setTimeoutsetInterval的时间间隔不能保证完全 N毫秒。
您可以通过添加对队列的调用来稍微推迟对某个方法的调用,就像上面的代码段一样。但是当处理队列时,排队调用将执行的顺序是你没有真正说的话。没有任何说法。

在有问题的代码之前或之后有多少文件或多少语句无关紧要:没有线程可以继续进行。

您发布的代码中有一个非常明显的错误:您将属性分配给other(属性为myObj,但此属性未在任何位置定义,更不用说定义为在访问它们之前首先声明属性来修复它:

var myObj = {other: {}};//other is an empty object literal
myObj.other.getName = function()
{
    console.log('This works');
};
alert('And the alert will show');

您当前的代码评估为:

var myObj = {};//object
var (myObj.other).getName = ...;
     //evaluates to undefined
    undefined.getName = ...//ERROR

undefined是一个原始值,实际上表示没有值。因此,undefined不能作为对象访问,也不能为其分配属性。

注意:
这只是为了完整性,但JS在大多数情况下确实是单线程的,但是ECMAScript5引入了Worker,它允许一些受限形式的多线程(例如,没有共享状态)。如果您想了解更多信息,请仔细阅读有关工人的MDN文档。