为什么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实现都是单线程的。这意味着所有的代码都是在一个线程(逻辑上)上顺序执行的。如果这个线程遇到致命错误,它就会停止。所有在错误发生点之后的代码都被忽略(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毫秒内(立即)调用匿名函数,但该回调被发送到队列,并定期检查队列。在检查队列(并调用回调)之前,将显示警报。这就是为什么传递给setTimeout
或setInterval
的间隔不能保证是恰好是 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的文档。
- 解析云代码错误:解析.错误{代码:141,消息:“未调用成功/错误”}
- Visual Studio代码错误-未能加载jshint库
- 是我的“;给我发电子邮件”;按钮代码错误
- 按钮创建无法定位功能代码错误
- 双重可乐挑战,JavaScript代码错误
- JavaScript数组,代码错误
- 在 cordova 项目中,我正在使用文件传输插件上传个人资料照片,它总是返回代码 1 错误
- JavaScript 代码错误:图像不显示
- 基本程序的JavaScript代码错误(猜谜游戏)
- IMACROS 将 iim 代码转换为 javascript 后代码错误
- Javascript代码错误
- Javascript简单代码错误
- Perl CGI代码错误
- 这是尝试解析带有时刻的 ASP.NET 日期.js库的错误还是我的代码错误
- JS,PHP,MySQL代码错误用于数学运算
- Parse.com云代码错误:尝试更新用户时未调用success/Error
- Javascript代码错误显示未定义的值
- JavaScript表单验证代码错误
- Adbrite什么都没出现.可能的代码错误
- Jquery代码错误:Undefined不是一个函数