# Vue學習#2 this的運作 ###### tags: `Vue 直播班 - 2022 春季班` `Vue` ### 什麼是simple call --- 直接使用函式 ```=JavaScirpt var someone = '全域'; function callSomeone() { console.log(this.someone); } callSomeone(); // simple call ``` #### <font color='red'> !!!! 使用 simple call this就會呼叫全域 </font> #### <font color='red'> this 就是呼叫方法時,「點」前面的那個物件。</font> ### callback function --- ### 把函式當作另一個函式的參數,透過另一個函式來呼叫它 ### 或是一個函式在另一個函式中被使用 ```=Javascirpt var doFirst = function (callback) { console.log('do first...'); callback(); // <---執行傳入的doLater() } /** callback function **/ var doLater = function () { console.log('do later...') } doFirst(doLater); ``` #### <font color='red'> !!!! callback function 也是呼叫全域 </font> ### 如何看this --- 不是看呼叫的位置,而是呼叫的方式來決定 this 指向的是誰。 以下範例來看: 呼叫 callSomeone() 這個函式前面沒有任何的東西,就會抓到全域那個 someone 值 如果是直接使用 obj.callSomeone() 就會抓到該物件內的 someone 值 ```=Javascript // #3 注意:this 的指向相當複雜,大部分情境只需要了解其中一種即可(95%) // 傳統函式中的 this 只與調用方式有關 var someone = '全域'; function callSomeone() { console.log(this.someone); } callSomeone(); //ans:全域 // #4 各種運用變化 var obj = { someone: '物件', callSomeone() { console.log(this.someone); } } obj.callSomeone(); //ans:物件 ``` ### 箭頭函式看this --- ### 看包覆箭頭函式的function所指向的地方,沒有包覆就是抓全域 範例: ```=Javascript // #2 This 綁定的差異 // #2-1 活用觀念,將內層的改為箭頭 // 箭頭函式沒有自己的this var name = '全域' const person = { name: '小明', callName: function () { console.log('1', this.name); // 1 小明 setTimeout(()=> { console.log('2', this.name); // 2 ans:小明 console.log('3', this); // 3 ans: person這個物件 }, 10); }, } person.callName(); // 包覆箭頭函式的function(callName)被person這個物件所使用的,所以箭頭函式裡面的this.name會抓person裡面的name // this則會抓person這個物件 ``` #### 如何把this避免指向全域的兩種方法 1. this先指向其他變數 2. 使用箭頭函式 ```=JavaScript function callSomeone() { console.log(this.someone); } var obj4 = { someone: '物件 4', fn() { //const vm = this; // (1)用一個變數指向 this, vm 在 Vue 中意指 ViewModel setTimeout(()=> { //2 使用箭頭函式 console.log(this.someone); }); } } obj4.fn(); ``` ## 參考資料 [JavaScript 什麼是Callback函式 (Callback Function)?](https://matthung0807.blogspot.com/2019/05/javascript-callback-callback-function.html)
{"metaMigratedAt":"2023-06-16T17:13:06.392Z","metaMigratedFrom":"Content","title":"Vue學習#2 this的運作","breaks":true,"contributors":"[{\"id\":\"8af692af-04d3-4a40-b58d-bebaae919f9d\",\"add\":2241,\"del\":90}]"}
Expand menu