摘要:廢話真多,是的哈而要說清和的二三事,又不是件容易的事,簡(jiǎn)單理解,和指向同一內(nèi)存區(qū)域。而對(duì)于當(dāng)前模塊來說是外部的模塊。參考關(guān)于和的區(qū)別和的區(qū)別這篇文章很不賴。
AMD中define常見的形式
define("alpha" ,["require", "exports", "module"], function(require, exports, module) { var foo = require("foo"); module.exports = exports = function() { foo.doSomething(); } });
參數(shù)
第一個(gè)是要定義的模塊名字(id)
第二個(gè)是要用到的模塊名,其實(shí)更專業(yè)點(diǎn)講是定義的這個(gè)模塊所依賴的模塊名稱
第三個(gè)回調(diào)函數(shù),是要定義模塊內(nèi)容
分析方法:替換部分代碼進(jìn)行分析
先來把回調(diào)中的require,exports,module替換了看看。
1.替換requirefunction callback(exports, module) { // 假設(shè)foo是最簡(jiǎn)單的對(duì)象,把require("foo")換成最簡(jiǎn)答的對(duì)象看看 var foo = { "doSomething": function() {} }; module.exports = exports = function() { foo.doSomething(); } }
那么其實(shí)已經(jīng)不難看出,require其實(shí)就相當(dāng)于是個(gè)查詢函數(shù)吧,我給他傳個(gè)對(duì)象名,它就能給我一個(gè)具體的對(duì)象。
var require = function(name) { var modules = {"foo": {"doSomething": function() {}}}; return modules[name] || {}; }
那么整個(gè)代碼可以換成
var require = function(name) { var modules = {"foo": {"doSomething": function() {}}}; return modules[name] || {}; } function callback(exports, module) { var foo = require("foo"); module.exports = exports = function() { foo.doSomething(); } }
看起來好像有點(diǎn)道理哦,等會(huì)兒,等會(huì)兒,這里的modules又從哪兒冒出來的,哈哈哈,被發(fā)現(xiàn)了,別急慢慢來
2. 替換exports和module.exports在替換之前,先來了解下exports和module.exports這兩貨是干啥的,而要了解他們先來看看模塊是啥。
其實(shí)模塊么,簡(jiǎn)單來說就是一個(gè)高級(jí)別的function,輸入,處理,輸出。至于為啥js的模塊化為啥這么困難,這個(gè)問題不是三言兩語(yǔ)就能解釋清楚的,就不展開了(其實(shí)真實(shí)情況是,我也不清楚,哈哈哈)
既然模塊要做輸出,那么輸出什么東西總要知道吧,而module.exports的作用就是這個(gè),存儲(chǔ)模塊輸出的內(nèi)容。
也就是說,這個(gè)模塊中要給外部使用的東西全放在module.exports里頭了。廢話真多,是的哈- -.
而要說清e(cuò)xports和module.exports的二三事,又不是件容易的事,簡(jiǎn)單理解,exports和module.exports指向同一內(nèi)存區(qū)域。有興趣可以看看exports 和 module.exports 的區(qū)別。
那來改造一下,把module.exports,exports也提煉出來看看
var require = function(name) { var modules = {"foo": {"doSomething": function() {}}}; return modules[name] || {}; } var module = {}; var module.exports = exports = {}; function callback() { var foo = require("foo"); module.exports = exports = function() { foo.doSomething(); } }define的推測(cè)
// 這里的id相當(dāng)于模塊名,deps就是需要依賴的模塊名稱列表 define = function(id , deps, callback) { callback(require, exports, module); };
暈,那require,exports,module跑哪兒溜達(dá)去了?加上去看看
define = function(id , deps, callback) { var require = function(name) { var modules = {"foo": {"doSomething": function() {}}}; return modules[name] || {}; } var module = {}; var module.exports = exports = {}; callback(require, exports, module); };
看上去挺有道理的么,那么modules這玩意兒到底是哪兒冒出來的呢。
可以看出來modules 里面存放著的是foo模塊的內(nèi)容,那這些內(nèi)容是怎么來的呢?通過foo的module.exports提供的啊。那么modules里面其實(shí)放的是,foo的module.exports。
而foo對(duì)于當(dāng)前模塊來說是外部的模塊。而我想調(diào)用外面的東西,只有兩種辦法,要么傳參數(shù),要么通過全局變量(不過或許大神還有其他方案,我就只曉得這兩種了)。define里面有的參數(shù)沒有一個(gè)是存放module.exports的。那么答案呼之欲出了,modules是全局變量。
modules = {}; function load(id, exports) { (modules || (modules = {}))[id] = exports; }
再來看看完整的代碼,變成啥樣了
modules = {}; function load(name, exports) { (modules || (modules = {}))[name] = exports; } define = function(id, deps, callback) { var require = function(name) { return modules[name] || {}; } var module = {}; var module.exports = exports = {}; callback(require, exports, module); load(id, module.exports); };
到現(xiàn)在差不多已經(jīng)成型了,那么這里的require, exports, module都是外來的模塊吧bingo,其實(shí)callback里的模塊都是根據(jù)deps來的,去掉require, exports, module
modules = {}; function load(name, exports) { (modules || (modules = {}))[name] = exports; } define = function(id, deps, callback) { // 相當(dāng)于 // var module = {}; // var module.exports = {}; var module = modules["module"]; // 相當(dāng)于 //var require = function(name) { // return modules[name] || {}; //} var require = modules["require"]; var args = deps.map(require); callback.apply(null, args); load(id, module.exports); };來看define的另一種形式
define("alpha" ,["foo"], function(foo) { return function() { foo.doSomething(); } });
咦,精簡(jiǎn)了不少誒。沒有exports了誒,會(huì)返回了么
modules = {}; function load(name, exports) { (modules || (modules = {}))[name] = exports; } define = function(id, deps, callback) { var module = modules["module"]; var require = modules["require"]; var args = deps.map(require); var exports = callback.apply(null, args); load(id, exports || module.exports); };
OK,先告一段落了,累死我丫了。在慢慢優(yōu)化吧,唉。
參考(關(guān)于exports 和 module.exports 的區(qū)別)exports 和 module.exports 的區(qū)別這篇文章很不賴。
人家大神已經(jīng)說得非常好了。我在了淺薄的打個(gè)比方,我有個(gè)文件夾叫module.exports,然后我創(chuàng)建了一個(gè)超鏈接叫exports,那我在任何一個(gè)里面操作最終都會(huì)反應(yīng)到另一個(gè)里,但如果我把超鏈接exports刪了把它的指向地址改了,并不會(huì)影響真正的文件夾module.exports。
而有很多人明明已經(jīng)改了超鏈接exports的指向地址(如:exports = 123;),再在超鏈接里面做了很多操作(如:exports.hello = 456;),那都不會(huì)對(duì)真正的文件夾module.exports起到任何作用(你是見不到module.exports.hello === 456的)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/79529.html
摘要:前言由于博主最近又閑下來了,之前覺得的官方文檔比較難啃一直放到現(xiàn)在。文章會(huì)逐步分析每個(gè)處理的用意當(dāng)然是博主自己的理解,不足之處歡迎指出溝通交流。后續(xù)將會(huì)補(bǔ)上構(gòu)建生產(chǎn)的配置分析,案例參考。前端臨床手札構(gòu)建逐步解構(gòu)下 前言 由于博主最近又閑下來了,之前覺得webpack的官方文檔比較難啃一直放到現(xiàn)在。細(xì)心閱讀多個(gè)webpack配置案例后覺得還是得自己寫個(gè)手腳架,當(dāng)然這個(gè)案例是基于vue的,...
摘要:一冒泡和捕獲事件執(zhí)行子元素在執(zhí)行某個(gè)事件的前后,會(huì)引起上層元素觸發(fā)相同事件。三補(bǔ)充關(guān)于和這兩個(gè)其實(shí)和捕獲與冒泡一點(diǎn)關(guān)系都沒有,是用來阻止事件的默認(rèn)行為的。 一、冒泡和捕獲 事件執(zhí)行:子元素在執(zhí)行某個(gè)事件的前后,會(huì)引起上層元素觸發(fā)相同事件。例:我點(diǎn)擊了div,那么不光div會(huì)執(zhí)行click事件,上層的body和html等等也會(huì)執(zhí)行click。 冒泡與捕獲解決了:事件執(zhí)行順序由誰(shuí)開始,由誰(shuí)...
摘要:感覺不能這樣下去就學(xué)寫一下單元測(cè)試,等他更新代碼我都跑一遍確認(rèn)一下,這樣工作安心多了。具體執(zhí)行的測(cè)試用例實(shí)現(xiàn)代碼。測(cè)試工具斷言庫(kù)測(cè)試驅(qū)動(dòng)開發(fā)及測(cè)試框架入門學(xué)習(xí) 最近博主工作是和另一枚后端合作,但是經(jīng)常發(fā)現(xiàn)他寫的接口出錯(cuò),苦逼連連。感覺不能這樣下去就學(xué)寫一下單元測(cè)試,等他更新代碼我都跑一遍確認(rèn)一下,這樣工作安心多了。 經(jīng)過博主一番查找,貌似被推薦比較多的有mocha和chai,下面記錄簡(jiǎn)...
摘要:感覺不能這樣下去就學(xué)寫一下單元測(cè)試,等他更新代碼我都跑一遍確認(rèn)一下,這樣工作安心多了。具體執(zhí)行的測(cè)試用例實(shí)現(xiàn)代碼。測(cè)試工具斷言庫(kù)測(cè)試驅(qū)動(dòng)開發(fā)及測(cè)試框架入門學(xué)習(xí) 最近博主工作是和另一枚后端合作,但是經(jīng)常發(fā)現(xiàn)他寫的接口出錯(cuò),苦逼連連。感覺不能這樣下去就學(xué)寫一下單元測(cè)試,等他更新代碼我都跑一遍確認(rèn)一下,這樣工作安心多了。 經(jīng)過博主一番查找,貌似被推薦比較多的有mocha和chai,下面記錄簡(jiǎn)...
摘要:然而我真的太天真,微信瀏覽器怎樣會(huì)讓你這樣好過問題集中于自動(dòng)播放視頻這塊,需求很簡(jiǎn)單自動(dòng)播放全屏不顯示工具條自動(dòng)播放一步步來,自動(dòng)播放這個(gè)問題在十分肯定默認(rèn)是不支持的,必須基于用戶操作下才能加載視頻。至于在微信下和一個(gè)樣。 某天收到舊同事的信息說希望我?guī)褪肿鲆幌乱粋€(gè)簡(jiǎn)單的H5,然后我看了看的確很簡(jiǎn)單: 就是圖片滾動(dòng)到最后自動(dòng)播放視頻,播完顯示個(gè)按鈕交互。 然而我真的太天真,微信瀏覽器怎...
閱讀 1740·2021-10-18 13:30
閱讀 2621·2021-10-09 10:02
閱讀 2969·2021-09-28 09:35
閱讀 2097·2019-08-26 13:39
閱讀 3529·2019-08-26 13:36
閱讀 1956·2019-08-26 11:46
閱讀 1139·2019-08-23 14:56
閱讀 1700·2019-08-23 10:38