"use strict" 和函数调用中的命名参数
"use strict" and naming arguments in function calls
一位同事建议我在我的 JS 代码的顶部添加 "use strict";
以突出我的定义中的任何空白和潜在的引用错误等。我对此非常满意,因为它已经确定了几个部分可能是问题的代码。
但是,另一位同事建议我,在调用带有多个参数的函数时,按照指定的方式命名参数会很有帮助,尤其是当它是一堆布尔值时。为了说明,这里有几个函数调用:
logData(data, target, preserveLog=true, changeClass=false, wrapLine=false);
...比
更清晰
logData(data, target, true, false, false);
但是"use strict";
讨厌这个。在我这样做的任何地方,我都会在控制台中收到参考错误。正如预期的那样,它仍然运行良好,但控制台现在被所有这些明显未定义的引用弄得乱七八糟。
有谁知道是否有办法解决这个问题,以便我可以保留我的同事欣赏的编码约定,或者我将不得不停止使用 "use strict";
或检查我的所有代码并删除参数名称?
谢谢。
However, another colleague advised me that when calling functions which take multiple arguments, it can be helpful to name the arguments as they are specified, especially if it's something like a bunch of booleans.
这是糟糕的建议!
Javascript 实际上不支持以这种方式按名称传递参数。您传递的每个参数 "by name" 实际上都被视为对具有该名称的全局变量的赋值,并且 "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 for this answer, which I based my recommendation off of 致敬。)
我不会对此添加任何内容,只是说我完全同意,但他没有提到任何因 ES6 而产生的约定。
在 ES6 中,你仍然没有命名参数,但你有次好的东西,那就是 Object destructuring assignment。
这允许我们传递看似命名的参数,但实际上只是从未直接使用的对象的解构对象属性。
在您提供的示例的上下文中,它看起来像这样:
logData({data, target, preserveLog:true, changeClass:false, wrapLine:false});
其中函数定义为:
function logData({data, target, preserveLog, changeClass, wrapLine}) { ... }
我看到很多库在 ES6 可用的情况下更喜欢这种调用约定,而且它也非常方便,因为参数的顺序也不再重要。
一位同事建议我在我的 JS 代码的顶部添加 "use strict";
以突出我的定义中的任何空白和潜在的引用错误等。我对此非常满意,因为它已经确定了几个部分可能是问题的代码。
但是,另一位同事建议我,在调用带有多个参数的函数时,按照指定的方式命名参数会很有帮助,尤其是当它是一堆布尔值时。为了说明,这里有几个函数调用:
logData(data, target, preserveLog=true, changeClass=false, wrapLine=false);
...比
更清晰logData(data, target, true, false, false);
但是"use strict";
讨厌这个。在我这样做的任何地方,我都会在控制台中收到参考错误。正如预期的那样,它仍然运行良好,但控制台现在被所有这些明显未定义的引用弄得乱七八糟。
有谁知道是否有办法解决这个问题,以便我可以保留我的同事欣赏的编码约定,或者我将不得不停止使用 "use strict";
或检查我的所有代码并删除参数名称?
谢谢。
However, another colleague advised me that when calling functions which take multiple arguments, it can be helpful to name the arguments as they are specified, especially if it's something like a bunch of booleans.
这是糟糕的建议!
Javascript 实际上不支持以这种方式按名称传递参数。您传递的每个参数 "by name" 实际上都被视为对具有该名称的全局变量的赋值,并且 "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 for this answer, which I based my recommendation off of 致敬。)
在 ES6 中,你仍然没有命名参数,但你有次好的东西,那就是 Object destructuring assignment。
这允许我们传递看似命名的参数,但实际上只是从未直接使用的对象的解构对象属性。
在您提供的示例的上下文中,它看起来像这样:
logData({data, target, preserveLog:true, changeClass:false, wrapLine:false});
其中函数定义为:
function logData({data, target, preserveLog, changeClass, wrapLine}) { ... }
我看到很多库在 ES6 可用的情况下更喜欢这种调用约定,而且它也非常方便,因为参数的顺序也不再重要。