"return" 和 "this" 在严格模式下
"return" and "this" in strict-mode
是否可以在一个函数中同时使用 "this" 和 "return"?
像这样?
我经常使用不同的参数调用该函数。但是据我了解严格模式,您必须使用 "new convertSomething" 为每个参数启动函数。有更短的方法吗?
谢谢
"use strict";
function convertSomething(convertSeconds){
let minutes = Math.floor(convertSeconds / 600) % 600;
let seconds = Math.trunc(convertSeconds % 600 / 10);
let milliseconds = (convertSeconds % 600)%10;
this.milliseconds = milliseconds;
this.minutes = minutes;
this.seconds = seconds;
let formattedTime = minutes + ":" + seconds + "." + milliseconds;
this.formattedTime = formattedTime;
return formattedTime;
}
let showTime = new convertSomething(2005);
console.log(showTime.milliseconds);
console.log(showTime.formattedTime);
console.log(convertSomething(1000)); // ERROR: this is undefined
<html>
<head>
<meta charset="ISO-8859-1">
<script src="returnthis.js"></script>
</head>
<body>
</body>
</html>
即使这样做的原因值得怀疑,您也可以 this
:
function convertSomething(convertSeconds){
let minutes = Math.floor(convertSeconds / 600) % 600;
let seconds = Math.trunc(convertSeconds % 600 / 10);
let milliseconds = (convertSeconds % 600)%10;
let formattedTime = minutes + ":" + seconds + "." + milliseconds;
if(this){
this.milliseconds = milliseconds;
this.minutes = minutes;
this.seconds = seconds;
this.formattedTime = formattedTime;
}
return(formattedTime);
}
编辑
另一个解决方案是这个:
function convertSomething(convertSeconds,details){
let minutes = Math.floor(convertSeconds / 600) % 600;
let seconds = Math.trunc(convertSeconds % 600 / 10);
let milliseconds = (convertSeconds % 600)%10;
let formattedTime = minutes + ":" + seconds + "." + milliseconds;
if(details){
details.milliseconds = milliseconds;
details.minutes = minutes;
details.seconds = seconds;
details.formattedTime = formattedTime;
}
return(formattedTime);
}
然后你就可以为所有的事情调用这个函数了:
var time = convertSomething(2500);
var details = {};
var time2 = convertSomething(1000,details);
console.log(details.minutes) // or anything else
编辑 2
一般来说,class,函数、方法只做一件事。在您创建 API 的情况下,将函数同时用作函数和构造函数可能会使使用它的人感到非常困惑。由于这些原因,我给你的第二个选项可能是最好的使用方法。
现在,您的函数同时充当构造函数和常规函数,这些任务完全分开。当您将它与 new
一起使用时,return 值将被忽略(因为它是 primitive);当你在没有 new
的情况下使用它时,在草率模式下,属性被放在全局对象上并被忽略。
保持函数执行两项工作的清理是 return 一个包含所有所需属性的对象和另一个用于格式化字符串的对象:
"use strict";
function convertSomething(convertSeconds) {
let minutes = Math.floor(convertSeconds / 600) % 600;
let seconds = Math.trunc(convertSeconds % 600 / 10);
let milliseconds = (convertSeconds % 600)%10;
let formattedTime = minutes + ":" + seconds + "." + milliseconds;
return {
minutes,
seconds,
milliseconds,
formattedTime,
};
}
let showTime = convertSomething(2005);
console.log(showTime.milliseconds);
console.log(showTime.formattedTime);
console.log(convertSomething(1000).formattedTime);
一个函数做很多不相关的工作并不是一件好事。我建议将其拆分为一个函数以将多个分秒(这就是您所拥有的,因此其他名称 convertSeconds
和 milliseconds
具有误导性)转换为分、秒和分秒,以及一个格式化它的函数。
function timestampFromDeciseconds(ds) {
return {
minutes: Math.trunc(ds / 600),
seconds: Math.trunc(ds % 600 / 10),
deciseconds: ds % 10,
};
}
function formatTimestamp(timestamp) {
return `${timestamp.minutes}:${timestamp.seconds}.${timestamp.deciseconds}`;
}
然后你可以像这样使用它们:
"use strict";
function timestampFromDeciseconds(ds) {
return {
minutes: Math.trunc(ds / 600),
seconds: Math.trunc(ds % 600 / 10),
deciseconds: ds % 10,
};
}
function formatTimestamp(timestamp) {
return `${timestamp.minutes}:${timestamp.seconds}.${timestamp.deciseconds}`;
}
let showTime = timestampFromDeciseconds(2005);
console.log(showTime.deciseconds);
let otherTime = timestampFromDeciseconds(1000);
console.log(formatTimestamp(otherTime));
是否可以在一个函数中同时使用 "this" 和 "return"? 像这样?
我经常使用不同的参数调用该函数。但是据我了解严格模式,您必须使用 "new convertSomething" 为每个参数启动函数。有更短的方法吗? 谢谢
"use strict";
function convertSomething(convertSeconds){
let minutes = Math.floor(convertSeconds / 600) % 600;
let seconds = Math.trunc(convertSeconds % 600 / 10);
let milliseconds = (convertSeconds % 600)%10;
this.milliseconds = milliseconds;
this.minutes = minutes;
this.seconds = seconds;
let formattedTime = minutes + ":" + seconds + "." + milliseconds;
this.formattedTime = formattedTime;
return formattedTime;
}
let showTime = new convertSomething(2005);
console.log(showTime.milliseconds);
console.log(showTime.formattedTime);
console.log(convertSomething(1000)); // ERROR: this is undefined
<html>
<head>
<meta charset="ISO-8859-1">
<script src="returnthis.js"></script>
</head>
<body>
</body>
</html>
即使这样做的原因值得怀疑,您也可以 this
:
function convertSomething(convertSeconds){
let minutes = Math.floor(convertSeconds / 600) % 600;
let seconds = Math.trunc(convertSeconds % 600 / 10);
let milliseconds = (convertSeconds % 600)%10;
let formattedTime = minutes + ":" + seconds + "." + milliseconds;
if(this){
this.milliseconds = milliseconds;
this.minutes = minutes;
this.seconds = seconds;
this.formattedTime = formattedTime;
}
return(formattedTime);
}
编辑
另一个解决方案是这个:
function convertSomething(convertSeconds,details){
let minutes = Math.floor(convertSeconds / 600) % 600;
let seconds = Math.trunc(convertSeconds % 600 / 10);
let milliseconds = (convertSeconds % 600)%10;
let formattedTime = minutes + ":" + seconds + "." + milliseconds;
if(details){
details.milliseconds = milliseconds;
details.minutes = minutes;
details.seconds = seconds;
details.formattedTime = formattedTime;
}
return(formattedTime);
}
然后你就可以为所有的事情调用这个函数了:
var time = convertSomething(2500);
var details = {};
var time2 = convertSomething(1000,details);
console.log(details.minutes) // or anything else
编辑 2
一般来说,class,函数、方法只做一件事。在您创建 API 的情况下,将函数同时用作函数和构造函数可能会使使用它的人感到非常困惑。由于这些原因,我给你的第二个选项可能是最好的使用方法。
现在,您的函数同时充当构造函数和常规函数,这些任务完全分开。当您将它与 new
一起使用时,return 值将被忽略(因为它是 primitive);当你在没有 new
的情况下使用它时,在草率模式下,属性被放在全局对象上并被忽略。
保持函数执行两项工作的清理是 return 一个包含所有所需属性的对象和另一个用于格式化字符串的对象:
"use strict";
function convertSomething(convertSeconds) {
let minutes = Math.floor(convertSeconds / 600) % 600;
let seconds = Math.trunc(convertSeconds % 600 / 10);
let milliseconds = (convertSeconds % 600)%10;
let formattedTime = minutes + ":" + seconds + "." + milliseconds;
return {
minutes,
seconds,
milliseconds,
formattedTime,
};
}
let showTime = convertSomething(2005);
console.log(showTime.milliseconds);
console.log(showTime.formattedTime);
console.log(convertSomething(1000).formattedTime);
一个函数做很多不相关的工作并不是一件好事。我建议将其拆分为一个函数以将多个分秒(这就是您所拥有的,因此其他名称 convertSeconds
和 milliseconds
具有误导性)转换为分、秒和分秒,以及一个格式化它的函数。
function timestampFromDeciseconds(ds) {
return {
minutes: Math.trunc(ds / 600),
seconds: Math.trunc(ds % 600 / 10),
deciseconds: ds % 10,
};
}
function formatTimestamp(timestamp) {
return `${timestamp.minutes}:${timestamp.seconds}.${timestamp.deciseconds}`;
}
然后你可以像这样使用它们:
"use strict";
function timestampFromDeciseconds(ds) {
return {
minutes: Math.trunc(ds / 600),
seconds: Math.trunc(ds % 600 / 10),
deciseconds: ds % 10,
};
}
function formatTimestamp(timestamp) {
return `${timestamp.minutes}:${timestamp.seconds}.${timestamp.deciseconds}`;
}
let showTime = timestampFromDeciseconds(2005);
console.log(showTime.deciseconds);
let otherTime = timestampFromDeciseconds(1000);
console.log(formatTimestamp(otherTime));