1. 程式人生 > >一道JavaScript面試題(setTimeout)

一道JavaScript面試題(setTimeout)


======================================================
注:本文原始碼點此下載
======================================================

一道javascript面試題(settimeout)

下面的程式碼,多久之後會彈出'end'? 為什麼?

var t = true;

settimeout(function(){ t = false; }, 1000);

while(t){ }

alert('end');

這是以前在想有沒辦法實現阻塞javascript執行緒的時候(即實現sleep方法),想過的一種實現。

很簡單,是吧?

是嗎?

作者:qleelulu

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利

綠色通道:好文要頂關注我收藏該文與我聯絡

posted on 2011-06-13 18:13 q.lee.lulu 閱讀(4302) 評論(37)編輯 收藏

評論:

2184924

#1樓

2011-06-13 18:28 | evanlee

馬上

回覆 引用 檢視

#2樓

2011-06-13 18:31 | gray zhang

無解吧……?

回覆 引用 檢視

#3樓

2011-06-13 18:43 | 大羅卜

根據設定的時間執行,但是執行的時候while迴圈語句已經開始執行了,由此判斷出,該程式會導致頁面的死迴圈,頁面無響應

回覆 引用 檢視

#4樓

2011-06-13 18:47 | franky

自然無解. timeout 回撥 是要等退出全部 execution context stack 後,才去計時的.

回覆 引用 檢視

#5樓

2011-06-13 18:48 | 木魚

@evanlee

典型的死迴圈……js是單執行緒執行的,while裡面死掉的時候settimeout裡面的函式是沒機會執行的。

回覆 引用 檢視

#6樓

2011-06-13 19:06 | 馬甲門

settimeout 只是掛了個定時任務,但是 js 本身是單執行緒的,while 那裡肯定死掉了。

回覆 引用 檢視

#7樓

2011-06-13 20:16 | shuxiang

事實證明,瀏覽器會談框停止指令碼或瀏覽器崩掉,6樓正解。話說你現在很牛b了啊!

回覆 引用 檢視

#8樓

2011-06-13 20:20 | 坎普利特

學習了 = =

回覆 引用 檢視

#9樓[樓主]

2011-06-13 20:35 | q.lee.lulu

引用franky:自然無解. timeout 回撥 是要等退出全部 execution context stack 後,才去計時的.

確定是退出全部 execution context stack 後,才去計時的?

回覆 引用 檢視

#10樓[樓主]

2011-06-13 20:37 | q.lee.lulu

引用木魚:

@evanlee

典型的死迴圈……js是單執行緒執行的,while裡面死掉的時候settimeout裡面的函式是沒機會執行的。

^_^!

死掉這個詞用的不怎麼恰當,呵呵

回覆 引用 檢視

#11樓[樓主]

2011-06-13 20:37 | q.lee.lulu

@shuxiang

香香你居然跑來部落格園混了 ?

回覆 引用 檢視

#12樓

2011-06-13 21:05 | 563812344[未註冊使用者]

死迴圈了,如果沒有死迴圈也不會馬上彈出來。。。要1s後,準不準就不一定了,js是單執行緒,而且類似定時器這樣的玩意兒都不準。以前用c++寫程式,本機測試少於50毫秒就不準了。

回覆 引用

#13樓

2011-06-13 21:05 | franky

引用q.lee.lulu:

引用franky:自然無解. timeout 回撥 是要等退出全部 execution context stack 後,才去計時的.

確定是退出全部 execution context stack 後,才去計時的?

有問什麼問題?

回覆 引用 檢視

#14樓

2011-06-13 21:07 | 行雲_流水

@franky

如果想要使用多執行緒。怎麼辦呢?

回覆 引用 檢視

#15樓

2011-06-13 21:17 | mk2

lulu這是想害大家卡死瀏覽器吧。。。哈哈

回覆 引用 檢視

#16樓[樓主]

2011-06-13 21:21 | q.lee.lulu

引用franky:

引用q.lee.lulu:

引用franky:自然無解. timeout 回撥 是要等退出全部 execution context stack 後,才去計時的.

確定是退出全部 execution context stack 後,才去計時的?

有問什麼問題?

先計時開始,然後再去while true的哦

回覆 引用 檢視

#17樓

2011-06-13 21:30 | franky

很不幸引用q.lee.lulu:

引用franky:

引用q.lee.lulu:

引用franky:自然無解. timeout 回撥 是要等退出全部 execution context stack 後,才去計時的.

確定是退出全部 execution context stack 後,才去計時的?

有問什麼問題?

先計時開始,然後再去while true的哦

很不幸,並不是這樣..

回覆 引用 檢視

#18樓[樓主]

2011-06-13 21:40 | q.lee.lulu

@franky

很不幸,計時確實已經開始了

1000毫秒後確實計時也結束了

那,然後呢?

嗯,問題就在這裡了~~

回覆 引用 檢視

#19樓

2011-06-13 21:55 | franky

引用q.lee.lulu:

@franky

很不幸,計時確實已經開始了

1000毫秒後確實計時也結束了

那,然後呢?

嗯,問題就在這裡了~~

餓.我表達有問題..計時是timeout api被呼叫時. 但這個callback 會在execution context stack 全部退出後.

回覆 引用 檢視

#20樓

2011-06-13 21:58 | 打醬油的。。。[未註冊使用者]

settimeout(function () { alert("start");}, 10);

alert('end');

先彈出end,再彈出start。

回覆 引用

#21樓

2011-06-13 22:03 | franky

事實要考慮的東西,比想象的要多. 譬如 html parser 的預讀. 這段程式碼在非opera下就比較有趣.

回覆 引用 檢視

#22樓

2011-06-13 22:34 | wangtz

引用馬甲門:settimeout 只是掛了個定時任務,但是 js 本身是單執行緒的,while 那裡肯定死掉了。

果然是這樣!學習了!

回覆 引用 檢視

#23樓

2011-06-13 23:07 | jeff wong

回覆 引用 檢視

#24樓[樓主]

2011-06-13 23:32 | q.lee.lulu

引用franky:

事實要考慮的東西,比想象的要多. 譬如 html parser 的預讀. 這段程式碼在非opera下就比較有趣.

有意思,opera下何解?

回覆 引用 檢視

#25樓

2011-06-14 00:30 | franky

個人的一些理解.後面一部分,有提到這個問題.

回覆 引用 檢視

#26樓

2011-06-14 09:00 | 劉江北

很典型的東西啊,好玩意~~~

回覆 引用 檢視

#27樓

2011-06-14 10:26 | testzhangsan

要非同步?試試老趙的 jscex

回覆 引用 檢視

#28樓

2011-06-14 15:02 | 幸運猴子

這個...不能用吧,執行緒會被阻塞...

回覆 引用 檢視

#29樓

2011-06-14 16:23 | 雲霆

果然是無解,會在while語句這裡形成死迴圈!

回覆 引用 檢視

#30樓

2011-06-14 16:30 | 知乎者也

頁面一直都在載入,不會彈出'end'

回覆 引用 檢視

#31樓

2011-06-14 16:49 | jifsu

沒看評論,我覺得這個在各種瀏覽器下表現應該不一樣.

回覆 引用 檢視

#32樓

2011-06-14 17:02 | jifsu

時間證明:

狗日的瀏覽器確實不爭氣,全部假死

ie6直接崩潰

ie9 提示指令碼執行時間過長,是否終止,點選否,ie9崩潰

firefox4 提示,選否 ,崩潰

opera11 不提示,也不崩潰,無限等待中

safri5 提示,選否,繼續提示.....無限迴圈

回覆 引用 檢視

#33樓

2011-06-14 17:23 | icbj.cn

假死

回覆 引用 檢視

#34樓

2011-06-15 15:26 | 追殺

@icbj.cn

opera11 不提示,也不崩潰,無限等待中

-------------------------------------

經測試,耐心等待後會提示指令碼繁忙之類的...

回覆 引用 檢視

#35樓

2011-06-15 18:45 | 雲和山的彼岸

試了一下,瀏覽器死了,哈哈

回覆 引用 檢視

#36樓

2011-06-17 17:46 | shuxiang

@q.lee.lulu

跟煜哥混,是很有前途的,果斷來混~~

回覆 引用 檢視

#37樓

2011-08-25 00:27 | yingzai621[未註冊使用者]

@q.lee.lulu

程式碼改成這樣是不是就成功彈出‘end’了?

function a(){}

var t = true;

settimeout(function(){ t = false; }, 1000);

while(t){a(); }

alert('end');

回覆 引用

發表評論

暱稱: [登入]

[註冊]

主頁:

郵箱:(僅博主可見)

評論內容:

記住我的暱稱和主頁

-->

登入註冊

[使用ctrl+enter鍵快速提交評論]

0

2079965

jicuf9skoki=

首頁博問快閃記憶體新聞園子招聘知識庫

最新it新聞:

最新知識庫文章:


======================================================
在最後,我邀請大家參加新浪APP,就是新浪免費送大家的一個空間,支援PHP+MySql,免費二級域名,免費域名繫結 這個是我邀請的地址,您通過這個連結註冊即為我的好友,並獲贈雲豆500個,價值5元哦!短網址是http://t.cn/SXOiLh我建立的小站每天訪客已經達到2000+了,每天掛廣告賺50+元哦,呵呵,飯錢不愁了,\(^o^)/

相關推薦

一道JavaScript試題setTimeout

======================================================注:本文原始碼點此下載 ======================================================一道javascript面試題

常見的關於JavaScript 試題

 9.實現函式 isInteger(x) 來判斷 x 是否是整數 可以將 x 轉換成10進位制,判斷和本身是不是相等即可: function isInteger(x){return parseInt(x,10)=== x;} ES6 對數值進行了擴充套件,提供了靜態方法

一道Java試題---關於static

碰到一道蠻有趣的題;記錄一下~ 問:一下程式碼輸出結果是什麼?為什麼? 輸出結果: 我們改變一下上述程式碼中的語句執行順序;再看列印結果如下: 從以上兩個結果中可以看到,當語句public static B t2 = new B();改變了順序之後;結果順序也相應的發生了改變;是什麼原

JAVA經典試題--如何體現JavaScript的繼承關係?

js裡常用的如下兩種繼承方式: 原型鏈繼承(物件間的繼承) 類式繼承(建構函式間的繼承) 由於js不像java那樣是真正面向物件的語言,js是基於物件的,它沒有類的概念。所以,要想實現繼承,可以用js的原型prototype機制或者用apply和call方

一道SQL試題行列互換

有一個SQL題在面試中出現的概率極高,最近有學生出去面試仍然會遇到這樣的題目,在這裡跟大家分享一下。 題目:資料庫中有一張如下所示的表,表名為sales。 年 季度 銷售量

一道hive試題窗口函數

import color 格式 win lin nbsp 面試 select eight 表student中的數據格式如下: name month degree s1 201801 As1 201802 As1 201803 Cs1 201804 As1 2

python試題

以及 args 空格 代碼實現 spa adding 技術分享 變量作用域 區別 Python中基本數據結構的操作 元組 列表 字典 集合 定義

每天五個java相關試題8--spring篇

ioc 簡單 組件 print 提交數據 常常 spring容器 效果 用戶 首先呢,假設有從事前端開發的大神或者準備從事前端開發的小夥伴無意看到我這篇博客看到這段文字歡迎加我的QQ:【 845415745 】。即將走入社會的菜鳥大學生有關於前端開發的職

java試題

imap 產生 java面試 大型 過程 ets ibm apache服務 廣泛 11、說出Servlet的生命周期,並說出Servlet和CGI的區別? Servlet被服務器實例化後,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣

Java電商項目試題

Java什麽是SolrCloudSolrCloud是Solr提供的分布式搜索方案,當你需要大規模,容錯,分布式索引和檢索能力時使用SolrCloud。當一個系統的索引數據量少的時候是不需要使用SolrCloud的,當索引量很大,搜索請求並發很高,這時需要使用SolrCloud來滿足這些需求。SolrCloud

Java電商項目試題

javadubbo服務開發流程,運行流程?zookeeper註冊中心的作用?使用流程:第一步:要在系統中使用dubbo應該先搭建一個註冊中心,一般推薦使用zookeeper。第二步:有了註冊中心然後是發布服務,發布服務需要使用spring容器和dubbo標簽來發布服務。並且發布服務時需要指定註冊中心的位置。第

Java電商項目試題

Java插入商品的話,要求級聯插入幾張表,你們當時是怎麽實現的?通過Redis生成商品編號(ID)保存商品表再保存Sku表(此表中外鍵,是商品表的ID)在青島做了兩年開發,大大小小參與過三個項目的開發,一個是某公司內部的人員管理系統,一個是物流項目,最近做的是一個電商項目。在整個項目中,我們采用的是nginx

Java試題

Java 基礎 程序員 面試 (1)面試題:數組中有沒有length(),字符串中有沒有length(),集合中有沒有length()? 數組中沒有length()方法,只有length屬性 字符串中有length()

Hadoop大數據試題

大數據 面試題 Hadoop 以下資料來源於互聯網,很多都是面試者們去面試的時候遇到的問題,我對其中有的問題做了稍許的修改了回答了部分空白的問題,其中裏面有些考題出的的確不是很好,但是也不乏有很好的題目,這些都是基於真實的面試來的,希望對即將去面試或向繼續學習hadoop,大數據等的朋友有幫助!

Python----試題

shutdown 兩種 模擬 lxml list move 道德 shu 通信 1、 post、get有什麽區別? 1. 根據HTTP規範,GET一般用於獲取/查詢資源信息,應該是安全的和冪等。而POST一般用於更新資源信息 2. get是在url中傳遞數據,數據放在

python3-開發試題python6.23基礎篇2

漢字 2個 特殊 問題 ase 第一個 else () 判斷 1、請至少列舉5個 PEP8 規範(越多越好)。 一、代碼編排 1、縮進。4個空格的縮進,不使用Tap,更不能混合使用Tap和空格 2、每行最大長度79,換行可以使用反斜杠,最好使用圓括號。換行點要在操作符

Java筆試試題

共享 ble ati uil sys res 表達式 split 底層 每日一句:想,都是問題;做,才是答案。 構造器Constructor是否可被Override?構造器Constructor不能被繼承,因此不能重寫Override,但是可以被重載Overload。

Java筆試試題

人員 syn 獲得 直接 作用 sleep 超過 分配 bcd 每日一句:我既不悲觀,也不樂觀,只是每天早上睜開眼睛迎接新的一天,一個人努力過下去 1. 下面這條語句一共創建了多少個對象:String s = "a"+"b"+&quo

java筆試試題

oot 控件庫 rect 地址 edi javascrip apach getc mat 每日一句: 你未必出類拔萃,但一定與眾不同。 1. 說說你使用過哪些ajax技術和框架,說它們的區別AJAX(Asynchronous JavaScript And XML,異步Jav

3.Java基礎試題

它的 面試 字節 java基礎面試題 參數 字符類型 其中 語句 con 一、在Java中,是值傳遞還是引用傳遞? 解析:在 Java 語言中,把對象作為參數傳遞給方法時,方法接收到的是對象內存引用的地址,而不是對象本身,這個引用地址是對象在內存中的位置,它不可能像對象內容