簡體   English   中英

嚴格模式下的“返回”和“此”

[英]“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

通常,類,函數,方法只能做一件事情。 在創建API的情況下,將函數同時用作函數和構造函數可能會使使用它的人感到困惑。 由於這些原因,我給您的第二個選擇也許是最好的使用方法。

現在,您的函數既充當構造函數又充當常規函數,並且這些任務是完全獨立的 當將它與new一起使用時,返回值將被忽略(因為它是一個原始值 ); 當您在草率模式下不使用它而沒有new功能時,屬性將放置在全局對象上並被忽略。

使該函數同時執行兩項工作的清除操作將是返回一個包含所有所需屬性的對象,另一個對象包含格式化字符串:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM