繁体   English   中英

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

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

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实现都是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文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM