朱焱伟 发表于 2022-6-28 12:54:55

unsafewindow里for循环不写var会怎样

# unsafewindow里for循环不写var会怎样
for循环不写var,看js执行的环境,可能报错,也可能不报错成功运行,还可能不报错默默出问题.
## for循环不写var的几种情况
- 在grant了unsafewindow的油猴脚本里for循环不加var,没有报错但是不打印
```javascript
// @grant      unsafewindow
for(a = 0;a < 10;a++){ console.log("#"); }
```
- for循环里不写var语句或者包含它的函数,在F12里均为不报错且正常打印
```javascript
function test(){
for(a = 0;a < 10;a++){ console.log("#"); }
}
for(a = 0;a < 10;a++){ console.log("#"); }
test();
```
- 在grant none的油猴脚本里for循环不写var,会直接报错
```javascript
// @grant      none
for(a = 0;a < 10;a++){ console.log("#"); }
/* Uncaught ReferenceError: a is not defined */
```
- nodejs的环境,正常
```nodejs
> for(a = 0;a < 10;a++){ console.log("#"); }
# 正常打印
> typeof a
'number'
```

## 起因
在unsafewindow的情况下,为了生成油猴脚本里某个字段,在Github上找了个相关的nodejs环境的项目,拷贝了里面一大坨生成这个字段的函数,放到F12里先跑一下,没有问题. 然后放进油猴脚本里,字段里有一部分是随机字符串,却总是空的.排查下来,就是其中生成随机字符串的函数出错,又百度到另外的生成随机数的函数将其替换,情况类似于下面这段代码.其中randomString函数来自(https://segmentfault.com/a/1190000022718482)
```javascript
// @grant      unsafewindow
/**
* 在油猴脚本unsafewindow的情况下for循环里面不写var,将会:
*1)没有报错信息
*2)得不到想要的结果
*/
function randomString(e) {// 网上拷贝来的函数
e = e || 32;
var t = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",
a = t.length,
n = "";
/* for里没写var会导致默默出问题 */
for (i = 0; i < e; i++) n += t.charAt(Math.floor(Math.random() * a));
return n
}
console.log("生成的16位随机字符串:"+randomString(16));/* 输出冒号后为空白 */
for(a = 0;a < 10;a++){ console.log("#"); }/* #号并没有输出来 */
console.log(typeof a);/* undefined */
```
分析原因,俩人的代码里面for循环里都没写var,这就坑人了,在他们的nodejs环境里不会出错,但在油猴脚本的unsafewindow下是不报错但默默出问题.
## 总结
for循环里哪怕不出语法错误,还是要把var或者let加上去,自己写代码时注意,抄代码时更要注意.

脚本体验师001 发表于 2022-6-28 14:02:20

这么神奇的吗!unsafewindow真是太霸道了不讲道理,没有报错还不打印,解释权归它所有似的
// @grant      none 下 删除'use strict'; 也是可行的

李恒道 发表于 2022-6-28 14:25:21

![图片.png](data/attachment/forum/202206/28/142512opu5z8jzrc9p2z4u.png)
我这里的话正常打印了。。。透

朱焱伟 发表于 2022-6-28 15:07:26

李恒道 发表于 2022-6-28 14:25
![图片.png](data/attachment/forum/202206/28/142512opu5z8jzrc9p2z4u.png)
我这里的话正常打印了。。 ...

我现在怀疑是不是一之哥不够撸棒,unsafewindow下脚本猫和油猴还不一样,油猴会报错,脚本猫不会..

李恒道 发表于 2022-6-28 15:17:43

朱焱伟 发表于 2022-6-28 15:07
我现在怀疑是不是一之哥不够撸棒,unsafewindow下脚本猫和油猴还不一样,油猴会报错,脚本猫不会.. ...
@王一之 你有你的free鲁棒吗

王一之 发表于 2022-6-28 17:26:51

朱焱伟 发表于 2022-6-28 15:07
我现在怀疑是不是一之哥不够撸棒,unsafewindow下脚本猫和油猴还不一样,油猴会报错,脚本猫不会.. ...

兼容问题挺难处理的,如果你从脚本猫的角度去看,这是油猴的bug,如果从油猴的角度去看,这的脚本猫的bug

cxxjackie 发表于 2022-6-28 20:32:09

王一之 发表于 2022-6-28 17:26
兼容问题挺难处理的,如果你从脚本猫的角度去看,这是油猴的bug,如果从油猴的角度去看,这的脚本猫的bug ...

我记得看到过类似的问题,应该跟严格模式有关:
https://bbs.tampermonkey.net.cn/thread-1876-1-1.html
页: [1]
查看完整版本: unsafewindow里for循环不写var会怎样