CodeQL 文档

平台特定语言特性的使用

ID: js/non-standard-language-feature
Kind: problem
Security severity: 
Severity: warning
Precision: very-high
Tags:
   - portability
   - maintainability
   - language-features
   - external/cwe/cwe-758
Query suites:
   - javascript-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

应避免使用非标准语言扩展,例如表达式闭包或`let` 表达式,因为它们会使代码难以阅读或重用。

建议

使用标准语言特性代替。例如,表达式闭包可以使用 ECMAScript 2015 箭头函数替换,或者使用普通函数替换;`let` 语句和表达式可以使用 ECMAScript 2015 `let` 声明替换;`for each ... in` 语句可以使用 ECMAScript 2015 `for ... of` 语句替换。

示例

以下示例使用带有`map` 的表达式闭包

[1, 2, 3].map(function(x) x * x);

使用 ECMAScript 2015 箭头函数的等效代码如下

[1, 2, 3].map((x) => x * x);

在 ECMAScript 2015 平台上,可以使用普通函数代替

[1, 2, 3].map(function (x) { return x * x; });

另一个示例,考虑使用`let` 语句

function sumOfSquares(a) {
	var sum = 0;
	for (var i=0; i<a.length; ++i) {
		let (square = a[i]*a[i]) {
			sum += square;
		}
	}
	return sum;
}

它可以轻松地使用块级`let` 声明替换

function sumOfSquares(a) {
	var sum = 0;
	for (var i=0; i<a.length; ++i) {
		let square = a[i]*a[i];
		sum += square;
	}
	return sum;
}

旧版本的 Firefox 支持数组推导的 postfix 表示法

var numbers = [1, 2, 3, 4, 5];
var squares = [i*i for (i of numbers)];

此表示法应转换为语义上等效的 prefix 表示法,该表示法受更新的浏览器支持

var numbers = [1, 2, 3, 4, 5];
var squares = [for (i of numbers) i*i];

参考文献

  • ©GitHub, Inc.
  • 条款
  • 隐私