"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);

一个函数做很多不相关的工作并不是一件好事。我建议将其拆分为一个函数以将多个分秒(这就是您所拥有的,因此其他名称 convertSecondsmilliseconds 具有误导性)转换为分、秒和分秒,以及一个格式化它的函数。

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));