2017-03-10 104 views
-1

一些观察。某些原生javascript功能被阻止。如警示框。如果浏览器允许用户编写其他阻止功能,那么它们不会比打破自己的页面更恶意。所以我不认为这是一个安全问题。为什么Javascript函数不能阻塞?

启用阻塞功能可能会导致不良的设计模式。也许这个目标仅仅是为了阻止草率的设计,因为JavaScript绝对是异步的。但这是一种相当自以为是的设计理念,可以融入语言本身。

问题: 是否有任何历史或技术原因,为什么它不可能建立另一个功能?或者相反,我误解了,有没有办法让其他函数阻塞?

建议的设计模式。我认为值得展示我的意思是一个阻塞函数。正常的设计模式是做:

doSomethingThatMayTakeTime(); 
function doSomethingThatMayTakeTime(){ 
    //Something that takes time 
    callback(); 
} 

function callback(){ 
    //Do something you only want to do once the first function is complete 
} 

但也有我的代码很多地方有没有可能的代码,我想直到doSomethingThatMayTakeTime函数执行被执行。在这种使用情况下,为什么我们可以说:

doSomethingThatMayTakeTime(); 
//NextLineOfCode 

function doSomethingThatMayTakeTime(){ 
    // Blocking Code -- Prevent execution of any code outside this function until this function returns/executes its last line 
    //Something that takes time 
} 

正如你可以在这个特定的使用情况下看到一个不会是疯了思考,这是一个更简洁的方法。虽然这看起来很具体,但我经常遇到这种情况。使用其他模式框替换警告框时会出现一个简单的示例。

+0

我想说的是,为环境而设计的javascript几乎总是可以执行的其他功能,即UI操作的事件处理程序。 – mrmcgreg

+2

“我想要执行的代码不存在”。你的代码 - 也许。但浏览器同时运行了很多其他的JS。你的代码__玩得很好。 –

+2

[我可以在这里询问什么主题?](https://stackoverflow.com/help/on-topic):“_但如果您的问题通常涵盖**特定的编程问题**,或软件算法或软件工具通常使用的工具;是一个实用的,可回答的问题,它是软件开发所特有的,然后你是在正确的地方提问你的问题!“) – Andreas

回答

1

有没有办法让其他功能阻塞?

功能本身,所有他们都阻止。放入一个无限循环并观察浏览器挂起。

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

+0

我不确定我关注。你能否详细说明一下。 – COMisHARD

+0

I/O,输入/输出 - 访问外部资源。做一个Ajax调用,下载文件,类似的东西。在node.js中,这还包括数据库访问,读取文件等。 –

0

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

这是一件坏事。对用户来说,它与浏览器崩溃没有区别。

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

你说,“JavaScript绝对是异步”。我不知道你是什么意思,但作为一个整体陈述,这决不是真的。 (例如,请参阅this thread。)您需要特别努力创建异步活动。有关更多信息,请参阅this documentation

1

你的意思是这样的吗?

$('#blocking').click(function() { 
 
    var d= new Date().getTime(); 
 
    while(new Date().getTime() - d < 10000) { 
 
    var a=1; 
 
    } 
 
});
<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>
:,做了很长一段时间将冻结您的浏览器(没有事件处理,直到它完成),我觉得你不理解JavaScript的单线程behavio(U)R任何的任何功能

相关问题