[TOC] > Sat Apr 24 2021 01:05:10 GMT+0800 (GMT+08:00) WPS JS 宏编辑器默认禁止全局作用域表达式;这意味着你不能像平时那样去写 JS 代码,在宏编辑器内一切都得部署在 function 内部。这点倒是跟 VBA 很像。这么做也是为了避免函数自动执行,本来宏都是被动的,允许 function 自动执行有违背宏设计的初衷。 ![](https://img.kancloud.cn/d7/cd/d7cd490962907851395990f1299b02b4_910x813.png) ## 禁止项开启时 > 禁止项处于勾选状态。 下面这种写法会报错: ```js const a = Worksheets.Item("Sheet1") function _m_sheetRename(){ a.Name = "汇总" } ``` ## 关闭禁止项后发生的诡异事件 但是如果你关闭了这两个禁止项,那么你就要注意了: 1. 没有调用的 function 也能执行(如果不带参数的话)。 ```js const a = Worksheets.Item("Sheet1") // 能列入宏列表,可执行 function _m_sheetRename(){ a.Name = "汇总" } // 下面这个正常情况下并不会被执行(也不会被列入宏列表),虽然你看到宏列表里有_m_sheetRename ,但实际上它拿到的是前面带function 的那部分。下面这个相当于白写——验证这个很简单,改成带参数的你就能看出来了。 _m_sheetRename() ``` ### 经测试(注意) 1. WPS JS宏只会匹配到带 function 的函数本体,如果单独在全局直接运行是不会被执行的,就跟上面的例子一样。 > 但也有例外,偶尔会被执行(但它绝对不是被列入宏列表的那一个),一定要避免这种写法。鬼知道它什么时候会给你来那么一下子。 2. 如果是回到 WPS 软件界面(不在JS宏编辑器界面),点击功能区菜单【JS宏】会弹出宏列表供你选择,只会执行你要选择的宏,其他的不会执行。 因此,解除禁止之后,函数的执行有点“失控”: ```js // 这里依然能执行 function _m_doAllFn(){ a() // function a(){...}依然可以单独执行 b() // function b(){...}依然可以单独执行 c() // function c(){...}依然可以单独执行 } // 正常情况下不会被执行,但偶尔会执行。可能发生在编辑器过一遍上下文的时候,最好规避这种写法。 _m_doAllFn() ``` > 关闭禁止项之后更符合大家平时的代码行文习惯,但对代码的严谨程度要求更高。 ### 可能的解释 1. 即便关闭了禁止项,但貌似 JS宏 并没有像常规那样将宏文件从头到尾过一遍。 2. 宏列表里列出的才是你能执行也是WPS能执行的,其他的它通通不认识(但函数间的调用、赋值是没有问题的,仅仅影响全局——能不能被 WPS 识别为可执行宏)。 总之,大家记得不要自运行就好。 ## Tips 如果解除了禁止项,建议为希望只有调用时才执行的函数加上参数,或者将其赋值给变量。做成对象的方法、装进Class都是可以的。 > 保持默认开启禁止项就好,省得分享宏代码的时候一大堆问题。