簡體   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