创建javascript对象

时间:2013-01-26 09:08:41

标签: javascript loops

设置: 你好。我正在尝试学习创建/实例化对象。我以为我应该能够创建多个可能具有不同数量的类似作品的对象(如收集新闻文章),并且无论创建的顺序如何都会“报告完成”。到目前为止,我对此并不清楚,所以这里有一个基本的例子,后面是陈述的问题:

function test(count){
    this.count = count;
    for(var i = 0; i< count; i++){}
    console.log(i);
}

new test(1000);
new test(10);

实际问题:

基于上面的代码,我希望第二个实例首先打印,但事实并非如此。什么是正确的设置方式,以便哪个对象完成其工作将首先打印?

*修改我的问题 * 对不起......我真正想要问的是如何设置对象以获得更多的异步行为。我是Stack的新手,所以如果我应该关闭/移动这个问题,请告诉我。

4 个答案:

答案 0 :(得分:1)

您没有创建不同的并行执行线程:第一个test(1000)在下一行开始之前完全执行。

在Javascript中,当你不使用webworkers(你可能不会使用它)时,你的所有代码总是在一个线程中执行。浏览器在事件中唤醒此线程,并在浏览器调用的函数返回时返回休眠状态。

请注意,即使使用线程,即使在自然并行语言中,您也几乎不能保证首先结束循环。

答案 1 :(得分:1)

一般来说,JavaScript是使用同步执行模型,即事件队列。所有调用都放在这里,基本上按照它们在源代码中出现的顺序(尊重它们所在的范围)。

因此,如果您启动某个函数,则在该函数完成之前不会执行任何其他操作。在您的情况下,您将两个调用都放在事件队列中,但第二个调用只会在第一个调用完成时执行。

然而,有例外:WorkerAJAX requests

此处执行在通常的事件队列之外,并且在执行完成后使用消息处理程序或回调来使用结果。但是,在大多数情况下,您无法确定调用的完成顺序,因为有许多情况会影响执行顺序(网络延迟,CPU使用等)。

在您的情况下,似乎您想要加载外部资源。那么看看AJAX是如何工作的。

答案 2 :(得分:1)

第二个实例不首先打印的原因是第一个调用new test(1000)在下一行new test(10)开始执行之前运行完成。

如果您希望第二次调用先运行,请交换两行......

编辑: 顺便说一下,任何体面的编译器都会完全删除这一行:

for(var i = 0; i< count; i++){}

所以你甚至不能指望第一次通话比第二次通话需要更多的时间......

答案 3 :(得分:1)

第二个实例仅在第一个对象实例化后才实例化。
所以它在new test(10)之后首先打印1000
因为是单线程程序