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

why is error in Javascript internal/external file stops the below code too?

本文关键字:代码 错误 内部 外部 文件 为什么 Javascript      更新时间:2023-09-26

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没有。这是一些相关的东西代码编译/解释。

如果有人给我解释一下这种行为,我将不胜感激。

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

所有的JS实现都是单线程的。这意味着所有的代码都是在一个线程(逻辑上)上顺序执行的。如果这个线程遇到致命错误,它就会停止。所有在错误发生点之后的代码都被忽略(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设置了一个超时,以便在0毫秒内(立即)调用匿名函数,但该回调被发送到队列,并定期检查队列。在检查队列(并调用回调)之前,将显示警报。这就是为什么传递给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关于worker的文档。