2017-06-22 63 views
0

一位同事劝我加入"use strict";到我的JS代码顶部突出显示在我的定义和潜在的引用错误,等等。我很高兴与它的任何差距,因为它有确定了几条可能成为问题的代码。“使用严格”和函数命名参数来调用

然而,另一位同事劝我,叫其多个参数的函数时,它可以帮助作为指定他们命名的参数,尤其是如果它像一堆布尔值。为了说明,这里的一对夫妇的函数调用:

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

...比更清晰一大堆:

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

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

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

谢谢。

+0

那么,严格的模式是正确的。这是一个可怕的做法。你在各处将价值渗透到全局变量中。不要这样做。 – Bergi

+1

如果你想使用“命名参数”,[传递对象](https://stackoverflow.com/a/11796776/1048572)。 – Bergi

+0

@Bergi谢谢,我可以改变一些更长的电话采取对象。 –

回答

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_ithis answer, which I based my recommendation off of。)

+0

感谢 - 公平地说,我认为他指的是C#。我最近才被转移到一个JavaScript项目上,并假设我在C#中学到的东西会在一定程度上继承下去。不是,在这种情况下,我想。 –

+1

使用局部变量名有助于记住参数意味着什么,但我们不能忘记它仍然是一个位置参数。 – Bergi

2

Duskwuff has already provided an excellent answer我不会添加任何东西,除了说我完全同意它,但他没有提到任何conventi由于ES6而产生。

在ES6,你还没有命名的参数,但你必须退而求其次,这是Object destructuring assignment

这让我们传递什么似乎被命名参数,但实际上只是解构是永远不会直接使用对象的对象属性。

在您所提供的示例的情况下,它会是这个样子:

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

凡函数定义为:

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

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

相关问题