RT,最近在学习JS,以用来写PAPI的脚本.
然后遇到了一个很诡异的问题,我简化一下,大概是这样:
复制代码对的,如你所见,mod函数里的str超过作用范围起作用了.
这就很诡异了.
我觉得可能是JS能判断哪个变量会被使用,哪个变量不会,于是我做了一个更极.端的例子:
复制代码这就更迷惑了.
他竟然超过作用域不销毁,仍然可以被正常使用.
有人能给萌新讲一下为什么么?
然后遇到了一个很诡异的问题,我简化一下,大概是这样:
- let a = {
- get: () => {
- console.log("outside");
- }
- }
- a.get(); //"outside"
- let mod = () => {
- let str = "inside mod";
- a.get = () => {
- console.log(str);
- }
- str = "inside mod & modify";
- }
- a.get(); //"outside"
- mod();
- a.get(); //"inside mod & modify"
这就很诡异了.
我觉得可能是JS能判断哪个变量会被使用,哪个变量不会,于是我做了一个更极.端的例子:
- let a = {
- get: () => {
- console.log("outside");
- }
- }
- a.get(); //"outside"
- let mod = () => {
- let str1 = "inside mod 1";
- let str2 = "inside mod 2";
- a.get = (code) => {
- eval("console.log(" + code + ");");
- }
- str1 = "inside mod 1 & modify";
- str2 = "inside mod 2 & modify";
- }
- a.get("str1"); //"outside"
- a.get("str2"); //"outside"
- mod();
- a.get("str1"); //"inside mod 1 & modify"
- a.get("str2"); //"inside mod 2 & modify"
他竟然超过作用域不销毁,仍然可以被正常使用.
有人能给萌新讲一下为什么么?
PAPI类问题自定义变量我问过 这里几乎没人可以回答
本帖最后由 Zapic 于 2020-5-18 00:03 编辑
已自行解决.
复制代码在mod里重载a.get时,实际上就是对str1和str2的引用.
因为在重载时,重载的函数上下文包括str1和str2,这就自然被重载后的函数所引用,因此不会被销毁,不会变得无法调用.
一旦再次调用mod,a.get再次被重载,这时会丢弃原来的上下文,之前的str1和str2也就会因为失去引用而随之被销毁.
已自行解决.
- let a = {
- get: () => {
- console.log("outside");
- }
- }
- a.get(); //"outside"
- let mod = () => {
- let str1 = "inside mod 1";
- let str2 = "inside mod 2";
- a.get = (code) => {
- eval("console.log(" + code + ");");
- }
- str1 = "inside mod 1 & modify";
- str2 = "inside mod 2 & modify";
- }
- a.get("str1"); //"outside"
- a.get("str2"); //"outside"
- mod();
- a.get("str1"); //"inside mod 1 & modify"
- a.get("str2"); //"inside mod 2 & modify"
因为在重载时,重载的函数上下文包括str1和str2,这就自然被重载后的函数所引用,因此不会被销毁,不会变得无法调用.
一旦再次调用mod,a.get再次被重载,这时会丢弃原来的上下文,之前的str1和str2也就会因为失去引用而随之被销毁.