在javascript中返回语句后执行语句

Fai*_*jad 6 html javascript jquery dom-events

window.onbeforeunload = function() {
    if (document.getElementById("parentpan").style.display == "block") {
        return "You are logged out.";
            Logout();
    }
};
Run Code Online (Sandbox Code Playgroud)

我希望在return语句之后调用logout()函数,是否可能?

Fem*_*ref 9

在return语句之后,您无法执行任何操作.

编辑:该finally语句允许在进行return清理之后执行代码.

(这是XY问题的一个很好的例子:你问Y而从不告诉我们你实际需要什么X).

  • @Femaref:实际上,有。(`终于`) (3认同)

sgr*_*rif 6

return语句结束一个函数,你不能在它之后执行代码.你可以这样做:

ret = "You are logged out.";
Logout();
return ret;
Run Code Online (Sandbox Code Playgroud)


Aad*_*hah 6

您需要的是Logout异步执行。这可以通过使用setTimeout其他人所说的函数在 JavaScript 中轻松实现。这是我常用的异步调用函数的方法:

Function.prototype.async = function () {
    setTimeout.bind(null, this, 0).apply(null, arguments);
};
Run Code Online (Sandbox Code Playgroud)

此方法立即(在0ms之后)将函数调用推送到事件循环中。因此该函数在当前代码完成后执行(对你来说是在你返回之后)。这是一个如何使用它的简单示例:

alert.async("This will be displayed later.");
alert("This will be displayed first.");
Run Code Online (Sandbox Code Playgroud)

由于第一个alert是异步调用的,它将在第二个调用之后执行alert。就像在函数调用之前使用async. 这就是你在你的情况下会做的:

window.onbeforeunload = function () {
    if (document.getElementById("parentpan").style.display === "block") {
        Logout.async();
        return "You are logged out.";
    }
};
Run Code Online (Sandbox Code Playgroud)

有什么缺点?由于该函数在事件循环中被阻塞,它可能永远没有机会执行(因此用户永远不会注销)。可能会出现这样的情况。它通常发生在控件进入无限循环或由于阻塞 AJAX 请求而挂起时。

不过,这对您来说是个好消息,这种情况发生在非常罕见的情况下。所以不用担心。就像setTimeout其他人开玩笑一样使用,你会做得很好。我个人认为您应该在返回消息之前注销"You are logged out.",但这是您的应用程序。

新年快乐。干杯!


小智 5

最好的方法和最有效的方法是 try, catch and finally

catch 是可选的

 `try{ 
     // do something
     return;
   } finally {
    // call function after return
   }`
Run Code Online (Sandbox Code Playgroud)

https://youtu.be/Is_o_L-ZIS8这对你有帮助