一道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
2011-06-13 18:28 | evanlee
馬上
回覆 引用 檢視
2011-06-13 18:31 | gray zhang
無解吧……?
回覆 引用 檢視
2011-06-13 18:43 | 大羅卜
根據設定的時間執行,但是執行的時候while迴圈語句已經開始執行了,由此判斷出,該程式會導致頁面的死迴圈,頁面無響應
回覆 引用 檢視
2011-06-13 18:47 | franky
自然無解. timeout 回撥 是要等退出全部 execution context stack 後,才去計時的.
回覆 引用 檢視
2011-06-13 18:48 | 木魚
@evanlee
典型的死迴圈……js是單執行緒執行的,while裡面死掉的時候settimeout裡面的函式是沒機會執行的。
回覆 引用 檢視
2011-06-13 19:06 | 馬甲門
settimeout 只是掛了個定時任務,但是 js 本身是單執行緒的,while 那裡肯定死掉了。
回覆 引用 檢視
2011-06-13 20:16 | shuxiang
事實證明,瀏覽器會談框停止指令碼或瀏覽器崩掉,6樓正解。話說你現在很牛b了啊!
回覆 引用 檢視
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
香香你居然跑來部落格園混了 ?
回覆 引用 檢視
2011-06-13 21:05 | 563812344[未註冊使用者]
死迴圈了,如果沒有死迴圈也不會馬上彈出來。。。要1s後,準不準就不一定了,js是單執行緒,而且類似定時器這樣的玩意兒都不準。以前用c++寫程式,本機測試少於50毫秒就不準了。
回覆 引用
2011-06-13 21:05 | franky
引用q.lee.lulu:
引用franky:自然無解. timeout 回撥 是要等退出全部 execution context stack 後,才去計時的.
確定是退出全部 execution context stack 後,才去計時的?
有問什麼問題?
回覆 引用 檢視
2011-06-13 21:07 | 行雲_流水
@franky
如果想要使用多執行緒。怎麼辦呢?
回覆 引用 檢視
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的哦
回覆 引用 檢視
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毫秒後確實計時也結束了
那,然後呢?
嗯,問題就在這裡了~~
回覆 引用 檢視
2011-06-13 21:55 | franky
引用q.lee.lulu:
@franky
很不幸,計時確實已經開始了
1000毫秒後確實計時也結束了
那,然後呢?
嗯,問題就在這裡了~~
餓.我表達有問題..計時是timeout api被呼叫時. 但這個callback 會在execution context stack 全部退出後.
回覆 引用 檢視
2011-06-13 21:58 | 打醬油的。。。[未註冊使用者]
settimeout(function () { alert("start");}, 10);
alert('end');
先彈出end,再彈出start。
回覆 引用
2011-06-13 22:03 | franky
事實要考慮的東西,比想象的要多. 譬如 html parser 的預讀. 這段程式碼在非opera下就比較有趣.
回覆 引用 檢視
2011-06-13 22:34 | wangtz
引用馬甲門:settimeout 只是掛了個定時任務,但是 js 本身是單執行緒的,while 那裡肯定死掉了。
果然是這樣!學習了!
回覆 引用 檢視
2011-06-13 23:07 | jeff wong
回覆 引用 檢視
#24樓[樓主]
2011-06-13 23:32 | q.lee.lulu
引用franky:
事實要考慮的東西,比想象的要多. 譬如 html parser 的預讀. 這段程式碼在非opera下就比較有趣.
有意思,opera下何解?
回覆 引用 檢視
2011-06-14 00:30 | franky
個人的一些理解.後面一部分,有提到這個問題.
回覆 引用 檢視
2011-06-14 09:00 | 劉江北
很典型的東西啊,好玩意~~~
回覆 引用 檢視
2011-06-14 10:26 | testzhangsan
要非同步?試試老趙的 jscex
回覆 引用 檢視
2011-06-14 15:02 | 幸運猴子
這個...不能用吧,執行緒會被阻塞...
回覆 引用 檢視
2011-06-14 16:23 | 雲霆
果然是無解,會在while語句這裡形成死迴圈!
回覆 引用 檢視
2011-06-14 16:30 | 知乎者也
頁面一直都在載入,不會彈出'end'
回覆 引用 檢視
2011-06-14 16:49 | jifsu
沒看評論,我覺得這個在各種瀏覽器下表現應該不一樣.
回覆 引用 檢視
2011-06-14 17:02 | jifsu
時間證明:
狗日的瀏覽器確實不爭氣,全部假死
ie6直接崩潰
ie9 提示指令碼執行時間過長,是否終止,點選否,ie9崩潰
firefox4 提示,選否 ,崩潰
opera11 不提示,也不崩潰,無限等待中
safri5 提示,選否,繼續提示.....無限迴圈
回覆 引用 檢視
2011-06-14 17:23 | icbj.cn
假死
回覆 引用 檢視
2011-06-15 15:26 | 追殺
@icbj.cn
opera11 不提示,也不崩潰,無限等待中
-------------------------------------
經測試,耐心等待後會提示指令碼繁忙之類的...
回覆 引用 檢視
2011-06-15 18:45 | 雲和山的彼岸
試了一下,瀏覽器死了,哈哈
回覆 引用 檢視
2011-06-17 17:46 | shuxiang
@q.lee.lulu
跟煜哥混,是很有前途的,果斷來混~~
回覆 引用 檢視
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-開發面試題(python)6.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 語言中,把對象作為參數傳遞給方法時,方法接收到的是對象內存引用的地址,而不是對象本身,這個引用地址是對象在內存中的位置,它不可能像對象內容