“use strict”和函数调用中的命名参数

时间:2017-06-22 08:25:47

标签: javascript calling-convention use-strict

一位同事建议我将"use strict";添加到我的JS代码的顶部,以突出我的定义和潜在的参考错误等方面的任何差距。我很满意它,因为它已经确定了几段代码,可能是一个问题。

然而,另一位同事告诉我,在调用带有多个参数的函数时,将参数命名为指定参数可能会有所帮助,特别是如果它类似于一堆布尔值。为了说明,这里有几个函数调用:

logData(data, target, preserveLog=true, changeClass=false, wrapLine=false);

......比以下更清楚:

logData(data, target, true, false, false);

但是"use strict";讨厌这个。无论我在哪里做到这一点,我都会在控制台中收到引用错误。它仍然运行良好,正如预期的那样,但控制台现在混杂着所有这些明显未定义的引用。

有没有人知道是否有办法解决这个问题,以便我可以保留我的同事所欣赏的编码惯例,或者我将不得不停止使用"use strict";或者查看我的所有代码并删除名称争论?

感谢。

2 个答案:

答案 0 :(得分:3)

  

然而,另一位同事告诉我,在调用带有多个参数的函数时,将参数命名为指定参数可能会有所帮助,特别是如果它类似于一堆布尔值。

这是一个糟糕的建议!

Javascript实际上并不支持通过名称传递参数。您通过“按名称”传递的每个参数实际上都被视为具有该名称的全局变量的赋值,并且"use strict"正确地将其识别为错误。

如果您想更清楚自己传递的是什么值,请将值分配给实际局部变量并传递它们,例如

var preserveLog = true;
var changeClass = false;
var wrapLine = false;
logData(data, target, preserveLog, changeClass, wrapLine);

如果您真的想继续使用原始模式,您甚至可以在函数调用中分配这些变量,只要首先将它们声明为局部变量:

var preserveLog, changeClass, wrapLine;
logData(data, target, preserveLog=true, changeClass=false, wrapLine=false);

(对于dav_i使用this answer, which I based my recommendation off of的帽子提示。)

答案 1 :(得分:2)

Duskwuff has already provided an excellent answer我不会添加任何内容,只是说我完全同意它,但他没有提到由于ES6而产生的任何约定。

在ES6中,你仍然没有命名参数,但你有下一个最好的东西,Object destructuring assignment

这允许我们传递看似命名的参数,但实际上只是一个永远不会直接使用的对象的解构对象属性。

在您提供的示例的上下文中,它看起来像这样:

logData({data, target, preserveLog:true, changeClass:false, wrapLine:false});

将函数定义为:

function logData({data, target, preserveLog, changeClass, wrapLine}) { ... }

我已经看到很多库更喜欢ES6可用的调用约定,并且它也非常方便,因为参数的顺序也不再重要。