this問題 以及 webstorm 除錯介面

weiewiyi發表於2022-11-23

this指標問題

image.png

1 export class Component {

2  task: Task;

3  test() {
4    _.foreach(this.task.propreties, funtion(property) {
5         const task = this.task;
6    })
  }

}

第5行中報錯: this 是 undefined。

原因比較容易判斷: 在foreach 中 this 並不是 component

用的是lodash提供的函式

https://www.lodashjs.com/docs...

檢視官網之後,並沒有提到this的問題。


於是檢視了Javascript中的foreach 函式

可以看到, Javascript中的foreach函式,有一個可選引數, thisArg

當執行回撥函式 callbackFn 時,用作 this 的值。

image.png



所以,若我們用的是Javascript中的foreach函式, 就可以使用如下的解決方案:

1 export class Component {
2  task: Task;
3  test() {
4    this.task.propreties.foreach(property => {
5         const task = this.task;
6    }, this)
  }
}

同時,我們也可以讓 task 作為 thisAry引數 , 如第六行。 這是時候 this 就表示 task。

1 export class Component {
2  task: Task;
3  test() {
4    this.task.propreties.foreach(property => {
5         const task = this;
6    }, task)
  }
}

值得注意的是,

如果 thisArg 引數有值,則每次 callbackFn 函式被呼叫時,this 都會指向 thisArg 引數。如果省略了 thisArg 引數,或者其值為 null 或 undefined,this 則指向全域性物件。

所以實際上,在Javascript中,不加這個this, 指的也是全域性物件。


回到前面, 由於lodash 提供的 _.foreach()函式, 並沒有如同 javascipt 中的 thisArg引數


image.png

所以,我們可以自己定義一個this。

const that = this;

之後用到 this 的地方,用 this 替換就可以。

1 export class Component {
2  task: Task;
3  test() {
4     const that = this;
5    _.foreach(that.task.propreties, funtion(property) {
6         const task = that.task;
7    })
  }
}

webstrom 或 idea 除錯介面按鈕

一、首先說第一組按鈕,共8個按鈕,從左到右依次如下:

image.png

Show Execution Point (Alt + F10):

如果你的游標在其它行或其它頁面,點選這個按鈕可跳轉到當前程式碼執行的行。

image.png

Step Over (F8)

步過,一行一行地往下走,如果這一行上有方法不會進入方法。

image.png

Step Into ( )

步入,如果當前行有方法,可以進入方法內部,一般用於進入自定義方法內,不會進入官方類庫的方法。

image.png

Force Step Into (Alt + Shift + F7):

強制步入,能進入任何方法,檢視底層原始碼的時候可以用這個進入官方類庫的方法。

image.png

Step Out (Shift + F8):

步出,從步入的方法內退出到方法呼叫處,此時方法已執行完畢,只是還沒有完成賦值。

image.png

Drop Frame (預設無):

回退斷點。回到方法的呼叫處,同時上下文內所有的變數的值也回到那個時候。

該按鈕能夠點選的前提條件是:當前所處的方法有上級方法,如果你是main方法裡,那麼按鈕就是灰色,無法點選;

image.png

Run to Cursor (Alt + F9):

執行到游標處,你可以將游標定位到你需要檢視的那一行,然後使用這個功能,程式碼會執行至游標行,而不需要打斷點。

image.png

Evaluate Expression (Alt + F8):

計算表示式。

image.png



二、第二組按鈕,共7個按鈕,從上到下依次如下:
image.png

Rerun 'xxxx'

重新執行程式,會關閉服務後重新啟動程式。

image.png

Resume Program (F9):恢復程式,

比如,你在第20行和25行有兩個斷點,當前執行至第20行,按F9,則執行到下一個斷點(即第25行),再按F9,則執行完整個流程,因為後面已經沒有斷點了。

image.png

Stop 'xxx' (Ctrl + F2):

連續按兩下,關閉程式。有時候你會發現關閉服務再啟動時,報埠被佔用,這是因為沒完全關閉服務的原因,你就需要查殺所有JVM程式了。
image.png

View Breakpoints (Ctrl + Shift + F8):檢視所有斷點。

image.png

7. Mute Breakpoints:

啞的斷點,選擇這個後,所有斷點變為灰色,斷點失效,按F9則可以直接執行完程式。再次點選,斷點變為紅色,有效。如果只想使某一個斷點失效,可以在斷點上右鍵取消Enabled。
image.png

相關文章