精准猎取科技资讯,天堂视频在线观看,高效阅读科技新闻_黄色av网站在线免费观看_科技猎

JavaScript 秘密花園

我是創始人李巖:很抱歉!給自己產品做個廣告,點擊進來看看。  

原文: http://bonsaiden.github.io/JavaScript-Garden/ ? 翻譯: 三生石上

其它

setTimeoutsetInterval

由于 JavaScript 是異步的,可以使用 setTimeoutsetInterval 來計劃執行函數。

注意: 定時處理 不是 ECMAScript 的標準,它們在 DOM (文檔對象模型) 被實現。
				function foo() {}
				var id = setTimeout(foo, 1000); // 返回一個大于零的數字
			

setTimeout 被調用時,它會返回一個 ID 標識并且計劃在將來 大約 1000 毫秒后調用 foo 函數。 foo 函數只會被執行 一次 。

基于 JavaScript 引擎的計時策略,以及本質上的單線程運行方式,所以其它代碼的運行可能會阻塞此線程。 因此 沒法確保 函數會在 setTimeout 指定的時刻被調用。

作為第一個參數的函數將會在 全局作用域 中執行,因此函數內的 this 將會指向這個全局對象。

				function Foo() {
				this.value = 42;
				this.method = function() {
				// this 指向全局對象
				console.log(this.value); // 輸出:undefined
				};
				setTimeout(this.method, 500);
				}
				new Foo();
			
注意: setTimeout 的第一個參數是 函數對象 ,一個常犯的錯誤是這樣的 setTimeout(foo(), 1000) , 這里回調函數是 foo返回值 ,而 不是 foo 本身。 大部分情況下,這是一個潛在的錯誤,因為如果函數返回 undefined , setTimeout不會 報錯。

setInterval 的堆調用

setTimeout 只會執行回調函數一次,不過 setInterval – 正如名字建議的 – 會每隔 X 毫秒執行函數一次。 但是卻不鼓勵使用這個函數。

當回調函數的執行被阻塞時, setInterval 仍然會發布更多的回調指令。在很小的定時間隔情況下,這會導致回調函數被堆積起來。

				function foo(){
				// 阻塞執行 1 秒
				}
				setInterval(foo, 1000);
			

上面代碼中, foo 會執行一次隨后被阻塞了一分鐘。

foo 被阻塞的時候, setInterval 仍然在組織將來對回調函數的調用。 因此,當第一次 foo 函數調用結束時,已經有 10 次函數調用在等待執行。

處理可能的阻塞調用

最簡單也是最容易控制的方案,是在回調函數內部使用 setTimeout 函數。

				function foo(){
				// 阻塞執行 1 秒
				setTimeout(foo, 1000);
				}
				foo();
			

這樣不僅封裝了 setTimeout 回調函數,而且阻止了調用指令的堆積,可以有更多的控制。 foo 函數現在可以控制是否繼續執行還是終止執行。

手工清空定時器

可以通過將定時時產生的 ID 標識傳遞給 clearTimeout 或者 clearInterval 函數來清除定時, 至于使用哪個函數取決于調用的時候使用的是 setTimeout 還是 setInterval 。

				var id = setTimeout(foo, 1000);
				clearTimeout(id);
			

清除所有定時器

由于沒有內置的清除所有定時器的方法,可以采用一種暴力的方式來達到這一目的。

				// 清空"所有"的定時器
				for(var i = 1; i < 1000; i++) {
				clearTimeout(i);
				}
			

可能還有些定時器不會在上面代碼中被清除( 譯者注 : 如果定時器調用時返回的 ID 值大于 1000), 因此我們可以事先保存所有的定時器 ID,然后一把清除。

隱藏使用 eval

setTimeoutsetInterval 也接受第一個參數為字符串的情況。 這個特性 絕對 不要使用,因為它在內部使用了 eval

注意: 由于定時器函數不是 ECMAScript 的標準,如何解析字符串參數在不同的 JavaScript 引擎實現中可能不同。 事實上,微軟的 JScript 會使用 Function 構造函數來代替 eval 的使用。
				function foo() {
				// 將會被調用
				}
				function bar() {
				function foo() {
				// 不會被調用
				}
				setTimeout('foo()', 1000);
				}
				bar();
			

由于 eval 在這種情況下不是被 直接 調用,因此傳遞到 setTimeout 的字符串會自 全局作用域 中執行; 因此,上面的回調函數使用的不是定義在 bar 作用域中的局部變量 foo 。

建議 不要 在調用定時器函數時,為了向回調函數傳遞參數而使用字符串的形式。

				function foo(a, b, c) {}
				// 不要這樣做
				setTimeout('foo(1,2, 3)', 1000)
				// 可以使用匿名函數完成相同功能
				setTimeout(function() {
				foo(a, b, c);
				}, 1000)
			
注意: 雖然也可以使用這樣的語法 setTimeout(foo, 1000, a, b, c) , 但是不推薦這么做,因為在使用對象的 屬性方法 時可能會出錯。 ( 譯者注: 這里說的是屬性方法內, this 的指向錯誤)

結論

絕對不要 使用字符串作為 setTimeout 或者 setInterval 的第一個參數, 這么寫的代碼明顯質量很差。當需要向回調函數傳遞參數時,可以創建一個 匿名函數 ,在函數內執行真實的回調函數。

另外,應該避免使用 setInterval ,因為它的定時執行不會被 JavaScript 阻塞。

本文被轉載1次

首發媒體 Web前端開發 | 轉發媒體

隨意打賞

提交建議
微信掃一掃,分享給好友吧。
主站蜘蛛池模板: 美缝剂_美缝剂厂家_美缝剂加盟-地老板高端瓷砖美缝剂 | 塑料撕碎机_编织袋撕碎机_废纸撕碎机_生活垃圾撕碎机_废铁破碎机_河南鑫世昌机械制造有限公司 | 加热制冷恒温循环器-加热制冷循环油浴-杭州庚雨仪器有限公司 | 包装盒厂家_纸盒印刷_礼品盒定制-济南恒印包装有限公司 | 整合营销推广|营销网络推广公司|石家庄网站优化推广公司|智营销 好物生环保网、环保论坛 - 环保人的学习交流平台 | 污水处理设备维修_污水处理工程改造_机械格栅_过滤设备_气浮设备_刮吸泥机_污泥浓缩罐_污水处理设备_污水处理工程-北京龙泉新禹科技有限公司 | 碎石机设备-欧版反击破-欧版颚式破碎机(站)厂家_山东奥凯诺机械 高低温试验箱-模拟高低温试验箱订制-北京普桑达仪器科技有限公司【官网】 | 一氧化氮泄露报警器,二甲苯浓度超标报警器-郑州汇瑞埔电子技术有限公司 | 植筋胶-粘钢胶-碳纤维布-碳纤维板-环氧砂浆-加固材料生产厂家-上海巧力建筑科技有限公司 | 体检车_移动CT车_CT检查车_CT车_深圳市艾克瑞电气有限公司移动CT体检车厂家-深圳市艾克瑞电气有限公司 | 强效碱性清洗剂-实验室中性清洗剂-食品级高纯氮气发生器-上海润榕科学器材有限公司 | 铁素体测量仪/检测仪/铁素体含量测试仪-苏州圣光仪器有限公司 | 睿婕轻钢别墅_钢结构别墅_厂家设计施工报价 | 钢板仓,大型钢板仓,钢板库,大型钢板库,粉煤灰钢板仓,螺旋钢板仓,螺旋卷板仓,骨料钢板仓 | 定制异形重型钢格栅板/钢格板_定做踏步板/排水沟盖板_钢格栅板批发厂家-河北圣墨金属制品有限公司 | 深圳侦探联系方式_深圳小三调查取证公司_深圳小三分离机构 | 拉卡拉POS机官网 - 官方直营POS机办理|在线免费领取 | 翰墨AI智能写作助手官网_人工智能问答在线AI写作免费一键生成 | 仓储货架_南京货架_钢制托盘_仓储笼_隔离网_环球零件盒_诺力液压车_货架-南京一品仓储设备制造公司 | 压缩空气检测_气体_水质找上海京工-服务专业、价格合理 | 活动策划,舞台搭建,活动策划公司-首选美湖上海活动策划公司 | 陕西鹏展科技有限公司| 砂磨机_立式纳米砂磨机_实验室砂磨机-广州儒佳化工设备厂家 | 冷水机-冰水机-冷冻机-冷风机-本森智能装备(深圳)有限公司 | 上海小程序开发-上海小程序制作公司-上海网站建设-公众号开发运营-软件外包公司-咏熠科技 | 便携式谷丙转氨酶检测仪|华图生物科技百科| 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 双齿辊破碎机-大型狼牙破碎机视频-对辊破碎机价格/型号图片-金联机械设备生产厂家 | 硫化罐_蒸汽硫化罐_大型硫化罐-山东鑫泰鑫智能装备有限公司 | 生物除臭剂-除味剂-植物-污水除臭剂厂家-携葵环保有限公司 | 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | 伸缩器_伸缩接头_传力接头-巩义市润达管道设备制造有限公司 | 陕西自考报名_陕西自学考试网| 定制液氮罐_小型气相液氮罐_自增压液氮罐_班德液氮罐厂家 | 温州中研白癜风专科_温州治疗白癜风_温州治疗白癜风医院哪家好_温州哪里治疗白癜风 | 注塑模具_塑料模具_塑胶模具_范仕达【官网】_东莞模具设计与制造加工厂家 | 亚克力制品定制,上海嘉定有机玻璃加工制作生产厂家—官网 | 骨灰存放架|骨灰盒寄存架|骨灰架厂家|智慧殡葬|公墓陵园管理系统|网上祭奠|告别厅智能化-厦门慈愿科技 | PSI渗透压仪,TPS酸度计,美国CHAI PCR仪,渗透压仪厂家_价格,微生物快速检测仪-华泰和合(北京)商贸有限公司 | 至顶网|