Zapic
RT,最近在学习JS,以用来写PAPI的脚本.
然后遇到了一个很诡异的问题,我简化一下,大概是这样:
  1. let a = {
  2.     get: () => {
  3.         console.log("outside");
  4.     }
  5. }
  6. a.get(); //"outside"
  7. let mod = () => {
  8.     let str = "inside mod";
  9.     a.get = () => {
  10.         console.log(str);
  11.     }
  12.     str = "inside mod & modify";
  13. }
  14. a.get(); //"outside"
  15. mod();
  16. a.get(); //"inside mod & modify"
复制代码
对的,如你所见,mod函数里的str超过作用范围起作用了.
这就很诡异了.
我觉得可能是JS能判断哪个变量会被使用,哪个变量不会,于是我做了一个更极.端的例子:
  1. let a = {
  2.     get: () => {
  3.         console.log("outside");
  4.     }
  5. }
  6. a.get(); //"outside"
  7. let mod = () => {
  8.     let str1 = "inside mod 1";
  9.     let str2 = "inside mod 2";
  10.     a.get = (code) => {
  11.         eval("console.log(" + code + ");");
  12.     }
  13.     str1 = "inside mod 1 & modify";
  14.     str2 = "inside mod 2 & modify";
  15. }
  16. a.get("str1"); //"outside"
  17. a.get("str2"); //"outside"
  18. mod();
  19. a.get("str1"); //"inside mod 1 & modify"
  20. a.get("str2"); //"inside mod 2 & modify"
复制代码
这就更迷惑了.
他竟然超过作用域不销毁,仍然可以被正常使用.
有人能给萌新讲一下为什么么?

炫宙菌
PAPI类问题自定义变量我问过 这里几乎没人可以回答

Zapic
本帖最后由 Zapic 于 2020-5-18 00:03 编辑

已自行解决.
  1. let a = {
  2.     get: () => {
  3.         console.log("outside");
  4.     }
  5. }
  6. a.get(); //"outside"
  7. let mod = () => {
  8.     let str1 = "inside mod 1";
  9.     let str2 = "inside mod 2";
  10.     a.get = (code) => {
  11.         eval("console.log(" + code + ");");
  12.     }
  13.     str1 = "inside mod 1 & modify";
  14.     str2 = "inside mod 2 & modify";
  15. }
  16. a.get("str1"); //"outside"
  17. a.get("str2"); //"outside"
  18. mod();
  19. a.get("str1"); //"inside mod 1 & modify"
  20. a.get("str2"); //"inside mod 2 & modify"
复制代码
在mod里重载a.get时,实际上就是对str1和str2的引用.
因为在重载时,重载的函数上下文包括str1和str2,这就自然被重载后的函数所引用,因此不会被销毁,不会变得无法调用.

一旦再次调用mod,a.get再次被重载,这时会丢弃原来的上下文,之前的str1和str2也就会因为失去引用而随之被销毁.

第一页 上一页 下一页 最后一页