摘要:去年暑假的時(shí)候開(kāi)通了博客園,然后開(kāi)始找工作,至今為止只寫(xiě)了一篇文章。慚愧啊今天興致來(lái)了,投身博客園,尼瑪,密碼忘記了。即有所謂的函數(shù)名函數(shù)名。獲取對(duì)的使用去除字符串兩端的空格說(shuō)明是嚴(yán)格模式,不能直接使用函數(shù)非嚴(yán)格模式
今天第一次在segmentfault里寫(xiě)文章。去年暑假的時(shí)候開(kāi)通了博客園,然后開(kāi)始找工作,至今為止只寫(xiě)了一篇文章。慚愧??!今天興致來(lái)了,投身博客園,尼瑪,密碼忘記了??戳四敲礋o(wú)聊的找回密碼,果斷轉(zhuǎn)投于此,但愿我以后能夠堅(jiān)持寫(xiě)點(diǎn)東西。畢竟,好好記性不如爛筆頭。
公司不讓去實(shí)習(xí),在學(xué)校待的無(wú)聊,前兩天再寫(xiě)東西的時(shí)候,突然意識(shí)到,已經(jīng)大半年沒(méi)有寫(xiě)過(guò)jQuery了。但看到那么多熟悉API,不想再去做重復(fù)的工作,果斷找到源碼,投入分析。
看源碼的進(jìn)程緩慢,但收獲確實(shí)挺大,尤其有利于扎實(shí)js底層知識(shí)。今天看到了源碼里面globalEval方法的實(shí)現(xiàn)。雖然用的不多,但是實(shí)現(xiàn)方法著實(shí)讓人眼前一驚(大神不算)。所以就從這里開(kāi)始我的文章生涯吧?。?/p>
eval和window.eval
對(duì)于eval基本的用法,對(duì)于任何一位前端來(lái)說(shuō),都不會(huì)陌生。jQuery源碼里面也有其基本使用,但是用法。可視我第一次見(jiàn)啊啊啊啊。
我們知道,當(dāng)我們?cè)谌致暶饕粋€(gè)函數(shù)的時(shí)候,就相當(dāng)于在window對(duì)象上面添加了一個(gè)方法。即有所謂的:函數(shù)名===window.函數(shù)名。以前在使用eval()函數(shù)的時(shí)候,也想當(dāng)然的認(rèn)為eval===window.eval。其實(shí),兩者的用法差距挺大的。
function create() { eval("var a = 2"); //和在函數(shù)里面直接var a = 2;的效果是一樣的 window.eval("var b = 3"); //這種其實(shí)是在全局作用域里面聲明了變量 b } //調(diào)用函數(shù) create(); consoole.log(a); //報(bào)錯(cuò):a is not defined console.log(b); // 3
從上面的函數(shù)里面,我們就可以看出eval就是把其參數(shù)在當(dāng)前的作用域里面運(yùn)行。而window.eval無(wú)論其處于什么作用域里,都會(huì)把其參數(shù)在全局作用域里面運(yùn)行。
除了直接使用window.eval外,我們也可以使用一個(gè)變量對(duì)其進(jìn)行引用
function create(){ { var ev = eval; //js就是這么神奇,這里的eval指的是window.eval,而非對(duì)eval的直接引用 ev("var c = 4"); } create(); console.log(c); //4
js果然是一門(mén)神奇的語(yǔ)言,那么小的一個(gè)玩意竟然會(huì)有那么多想不到的用法。
其實(shí)啊,eval在多帶帶使用的時(shí)候,js語(yǔ)言其實(shí)是把它作為一個(gè)結(jié)構(gòu)體來(lái)看待,而window.eval在使用的時(shí)候,卻真真是一個(gè)函數(shù)。
下面附上jQuery里面globalEval的源碼
//自己試著寫(xiě)的,順便使用了經(jīng)常使用的去除兩端空格的方法。 String.prototype.trim = function(){ return this.replace(/^(s+)|(s)+$/g,""); }; jQuery.globalEval = function(code){ var newScript, newEval = eval; //獲取對(duì)eval的使用 code = code.trim(); //去除字符串兩端的空格 if(code){ if(code.indexOf("use strict")){ //說(shuō)明是嚴(yán)格模式,不能直接使用window.eval函數(shù) newScript = document.createElement("script"); newScript.createTextNode(code); document.head.appendChild(newScript).parentNode.removeChild(newScript); }else{ //非嚴(yán)格模式 newEval(code); } } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/78982.html
摘要:作為前端最流行的類庫(kù),沒(méi)有之一,源碼必須得讀一讀。本博將不定期更新源碼解讀內(nèi)容,如果解讀不正確的地方,還請(qǐng)同學(xué)們?cè)谠u(píng)論中指正。這里使用的是改變的指向?yàn)閷?shí)例。其實(shí)就是中常見(jiàn)的四判斷是否是數(shù)字函數(shù)用于檢查其參數(shù)是否是無(wú)窮大。 jQuery作為前端最流行的類庫(kù),沒(méi)有之一,源碼必須得讀一讀。本博將不定期更新源碼解讀內(nèi)容,如果解讀不正確的地方,還請(qǐng)同學(xué)們?cè)谠u(píng)論中指正。 本系列文章基于jquer...
摘要:本項(xiàng)目總結(jié)了大部分替代的方法,暫時(shí)只支持以上瀏覽器。返回指定元素及其后代的文本內(nèi)容。從服務(wù)器讀取數(shù)據(jù)并替換匹配元素的內(nèi)容。用它自己的方式處理,原生遵循標(biāo)準(zhǔn)實(shí)現(xiàn)了最小來(lái)處理。當(dāng)全部被解決時(shí)返回,當(dāng)任一被拒絕時(shí)拒絕。是創(chuàng)建的一種方式。 原文https://github.com/nefe/You-D... You Dont Need jQuery showImg(https://segmen...
摘要:注同時(shí)移除元素上的事件及數(shù)據(jù)。其他對(duì)象通過(guò)其屬性名進(jìn)行迭代。原始數(shù)組不受影響。檢查對(duì)象是否為空不包含任何屬性。返回一個(gè)數(shù)字,表示當(dāng)前時(shí)間。兩者性能差不多接受一個(gè)標(biāo)準(zhǔn)格式的字符串,并返回解析后的對(duì)象。 在我看來(lái),jQuery確實(shí)已經(jīng)過(guò)時(shí)了。本項(xiàng)目總結(jié)了絕大部分 jQuery API 替代的方法,類似項(xiàng)目You-Dont-Need-jQuery,并會(huì)再此基礎(chǔ)上進(jìn)行很多的補(bǔ)充。寫(xiě)這個(gè)項(xiàng)目主要...
摘要:文章出處拜讀一個(gè)開(kāi)源框架,最想學(xué)到的就是設(shè)計(jì)的思想和實(shí)現(xiàn)的技巧。利用下的簡(jiǎn)單工廠模式,來(lái)將所有對(duì)于同一個(gè)對(duì)象的操作指定同一個(gè)實(shí)例。所以的中提供了以上中擴(kuò)展函數(shù)。 文章出處 http://www.cnblogs.com/aaronjs/p/3278578.html 拜讀一個(gè)開(kāi)源框架,最想學(xué)到的就是設(shè)計(jì)的思想和實(shí)現(xiàn)的技巧。 廢話不多說(shuō),jquery這么多年了分析都寫(xiě)爛了,老早以前就拜讀過(guò),...
閱讀 3826·2021-11-24 10:23
閱讀 2834·2021-09-06 15:02
閱讀 1348·2021-08-23 09:43
閱讀 2418·2019-08-30 15:44
閱讀 3115·2019-08-30 13:18
閱讀 839·2019-08-23 16:56
閱讀 1808·2019-08-23 16:10
閱讀 607·2019-08-23 15:08