gomeplusFED/GER

【前辈,请教个问题】在什么情况下,传入的参数会是一个字符串?所以这里的写法意义何在呀?

Closed this issue · 6 comments

GER/src/lib/proxy.js

Lines 217 to 223 in 12b2e4d

if ( utils.isString( cb ) ) {
try {
cb = new Function( cb );
} catch ( err ) {
throw err;
}
}

疑问

  • 什么情况下,传入的参数是一个字符串?
  • 如果没有传入字符串的情况,那么这段代码是否没有意义?

还请前辈解答下,谢谢🙏

@AsherSun 支持用字符串来声明函数,你可以看看 js 的 Function 构造函数Function

前辈,在问问题之前我已经查阅过 Function 构造函数的文档了。但是 这段代码的上下文语义 cb 回调函数是js中定时器的参数。于是我在浏览器控制台中写入

setTimeout('console.log(1)', 1000);

控制台抛错,由此证明js的定时器的参数并不支持字符串声明的函数

程序运行结果
image

代码上下文

GER/src/lib/proxy.js

Lines 212 to 231 in 12b2e4d

catTimeout( func ) {
return ( ...params ) => {
let timeArgs = utils.toArray(params);
let cb = timeArgs[0];
let timeout = timeArgs[1];
if ( utils.isString( cb ) ) {
try {
cb = new Function( cb );
} catch ( err ) {
throw err;
}
}
// for setTimeout(function, delay, param1, ...)
let args = timeArgs.splice(2);
cb = this.cat( cb, args.length && args );
return func( cb, timeout );
};
}

@AsherSun 看你截图是在 github 页面中打开的控制台,然后报错。
要学会看报错内容说的是什么意思,再下结论。
那么我们首先看看你截图里的报错是什么意思。

Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src github.githubassets.com".

这里有一个关键的词 unsafe-eval 这是CSP 策略指令中的知识。

上面的报错意思就是,因为未使用 unsafe-eval 关键字授权所以不能使用 eval() 方法,
setTimeout() 第一个参数如果是字符串,那么解析方式和 eval() 一样,结合上面的CSP策略解释,所以你在控制台执行就会报错。

你在其他页面或者自己写个 HTML 再试试?

下面附上 github 的响应中 CSP 的设置。

network

@qifeng0748 谢谢前辈解惑

学好英语很重要呀。