为什么Javascript函数无法阻止?

时间:2017-03-10 16:00:39

标签: javascript asynchronous

一些观察结果。某些原生javascript函数正在阻止。如警报框。如果浏览器允许用户编写其他阻止功能,那么他们可能不会比打破自己的页面更恶意。所以我不相信这是一个安全问题。

启用阻止功能可能会导致糟糕的设计模式。也许目标只是为了阻止草率设计,因为javascript绝对是异步的。但这是一种相当自以为是的设计概念,可以构建到语言本身中。

问题: 是否有任何历史或技术原因导致无法建立另一个功能?或者相反,我错了,是否有某种方法可以阻止其他功能?

推荐的设计模式。我认为通过阻止功能显示我的意思是值得的。正常的设计模式是:

set FIRST_DAY='2017-03-05';
... day > date '${hiveconf:FIRST_DAY}' ...

但是在我的代码中有很多地方有没有可能的代码我想要执行,直到执行doSomethingThatMayTakeTime函数。在这种使用场景中,为什么我们可以说:

... day > date ''2017-03-05'' ...

正如您在此特定用例中所看到的那样,认为这是一种更清洁的方法并不会让人发疯。虽然这看似具体,但我经常遇到这种情况。将警报框替换为其他模态框时会出现一个简单示例。

3 个答案:

答案 0 :(得分:2)

  

是否有某种方法可以阻止其他功能?

它们的功能本身全部都是阻止的。放入无限循环并观察您的浏览器挂起。

这是异步的I / O.不要混淆两者。

答案 1 :(得分:1)

你是说这样的意思吗?长期执行任何操作的任何功能都会冻结您的浏览器(直到完成后才会处理事件),我认为您不了解Javascript的单线程行为(



$('#blocking').click(function() {
  var d= new Date().getTime();
  while(new Date().getTime() - d < 10000) {
    var a=1;
  }
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="blocking">Block this tab for 10 seconds</button>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

当您运行阻止功能时,不仅页面上的代码被阻止。它是整个JavaScript引擎的主线程。如果用户单击一个按钮,尝试键入输入字段,滚动页面,或者执行生成JS引擎应该处理的事件的任何事情,在阻塞函数返回之前不会发生任何事情。

这是一件坏事。对于用户来说,它与浏览器崩溃无法区分。

请注意,警告框不会以相同方式阻止。是的,主事件处理线程被阻止,但不是所有事件处理。该对话框接管所有事件处理并以响应方式处理它。可以这样想:弹出警报暂时改变什么被视为事件;它根本不会阻止事件。

你说,“ javascript绝对是异步的”。我不知道你的意思,但作为一揽子声明,这绝对是不真实的。 (例如,请参阅this thread。)您需要特别努力创建异步活动。有关详细信息,请参阅this documentation