<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                [TOC] > Fri Apr 23 2021 23:43:19 GMT+0800 (GMT+08:00) 大家在寫 JS宏 的時候會碰到一些奇奇怪怪的問題,這里粗略做一些解答 ## 代碼上下文帶來的問題 > 最好不要關閉 WPS JS宏編輯器的那兩個禁止項(1. 禁止全局作用域表達式;2. 禁止全局作用域標識符重復定義),它們還是能幫你規避一些因為代碼上下文帶來的問題。 來看一個例子: ```js /* 新增一個工作表: 1. 位置: 最后一個工作表后面; 2. 將新工作表命名為 "mySheet" */ function _m_addNewSheet(){ let shCount = Worksheets.Count Worksheets.Add(null,Worksheets.Item(shCount)) Worksheets.Item(shCount).Name = "mySheet" } ``` 例子中哪里出了問題? * `let shCount = Worksheets.Count` 獲取工作表個數。 * `Worksheets.Add(null,Worksheets.Item(shCount))` 新增一個工作表,此時工作表個數已經發生變化,但因為上下文的關系 `shCount` 依舊是沒有新增工作表之前的個數。 * `Worksheets.Item(shCount).Name = "mySheet"` 因為 `shCount` 沒有變,所以是倒數第二個工作表被命名為"mySheet",新建的那個工作表是默認名。 ### 如何更改? * 刪掉 shCount ```js function _m_addNewSheet(){ Worksheets.Add(null,Worksheets.Item(Worksheets.Count)) Worksheets.Item(Worksheets.Count).Name = "mySheet" } ``` * 再次賦值 ```js function _m_addNewSheet(){ let shCount = Worksheets.Count Worksheets.Add(null,Worksheets.Item(shCount)) shCount = Worksheets.Count // 再次賦值(更新值) Worksheets.Item(shCount).Name = "mySheet" } ``` * +1 ```js function _m_addNewSheet(){ let shCount = Worksheets.Count Worksheets.Add(null,Worksheets.Item(shCount)) Worksheets.Item(shCount+1).Name = "mySheet" } ``` * shCount 函數化 > 在內部定義 ```js function _m_addNewSheet(){ let shCount = ()=>Worksheets.Count // 等效于 function(){return Worksheets.Count} Worksheets.Add(null,Worksheets.Item(shCount())) Worksheets.Item(shCount()).Name = "mySheet" } ``` > 在外部定義 ```js function _m_shCount(){ return Worksheets.Count } function _m_addNewSheet(){ Worksheets.Add(null,Worksheets.Item(_m_shCount())) Worksheets.Item(_m_shCount()).Name = "mySheet" } ``` * 異步化——不推薦,沒看出來有什么意義。 ```js async function _m_addSheet(){ let shCount = Worksheets.Count // 開始之前先獲取工作表數量 return new Promise((res,rej)=>{ Worksheets.Add(null,Worksheets.Item(shCount)) // 判斷是否新增完成 if(Worksheets.Count > shCount){ res(true) }else{ rej() } }) } // 下面這部分是多余的,因為前面的 async 是可以直接執行的…… function _m_test(){ _m_addSheet().then(()=>{ Worksheets.Item(Worksheets.Count).Name = "mySheet" }).catch(e=>{ Console.log(e) }) } ``` 對于那些值會改變的屬性,在使用的時候應該注意這種上下文導致的問題,如何避免: 1. 每次使用的時候都使用屬性本身——不將其賦值給變量 2. 嫌直接使用API太長,可以將其函數化處理——利用函數調用時執行的特點,盡可能實現和直接用API結果一致。 > 畢竟平時寫宏都是一些小片段(代碼量很少),沒幾個人會工程地化去弄一套宏(代碼量很大)。因此能直接用API的地方還是直接用
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看