1

一位同事建议我添加"use strict";到我的 JS 代码的顶部,以突出显示我的定义中的任何空白和潜在的引用错误等。我对此感到非常满意,因为它已经确定了几段代码,这可能是一个问题.

但是,另一位同事建议我,在调用带有多个参数的函数时,按照指定的参数命名参数会很有帮助,尤其是当它像一堆布尔值时。为了说明,这里有几个函数调用:

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

...比:

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

但是"use strict";讨厌这个。在我完成此操作的任何地方,我都会在控制台中收到参考错误。正如预期的那样,它仍然运行良好,但控制台现在被所有这些明显未定义的引用弄得乱七八糟。

有谁知道是否有办法解决这个问题,这样我就可以保持我的同事欣赏的编码约定,还是我将不得不停止使用"use strict";或浏览我的所有代码并删除参数的名称?

谢谢。

4

2 回答 2

6

但是,另一位同事建议我,在调用带有多个参数的函数时,按照指定的参数命名参数会很有帮助,尤其是当它像一堆布尔值时。

这是一个可怕的建议!

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 致敬,我的建议是基于.)

于 2017-06-22T08:32:11.597 回答
3

Duskwuff 已经提供了一个很好的答案,我不会添加任何内容,除了说我完全同意它,但他没有提到由于 ES6 而产生的任何约定。

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

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

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

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

其中函数定义为:

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

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

于 2017-06-22T09:03:09.410 回答