国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js手札--關(guān)于AMD的簡(jiǎn)單分析

frank_fun / 1121人閱讀

摘要:廢話真多,是的哈而要說清和的二三事,又不是件容易的事,簡(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)容

分析define的回調(diào)函數(shù)

分析方法:替換部分代碼進(jìn)行分析

先來把回調(diào)中的require,exports,module替換了看看。

1.替換require
function 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

相關(guān)文章

  • 前端臨床手札——webpack構(gòu)建逐步解構(gòu)(上)

    摘要:前言由于博主最近又閑下來了,之前覺得的官方文檔比較難啃一直放到現(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的,...

    lowett 評(píng)論0 收藏0
  • js手札--關(guān)于事件冒泡與事件捕獲

    摘要:一冒泡和捕獲事件執(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í)...

    lentoo 評(píng)論0 收藏0
  • 前端臨床手札——單元測(cè)試

    摘要:感覺不能這樣下去就學(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)...

    kid143 評(píng)論0 收藏0
  • 前端臨床手札——單元測(cè)試

    摘要:感覺不能這樣下去就學(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)...

    godlong_X 評(píng)論0 收藏0
  • 前端臨床手札——在微信播放視頻那些事

    摘要:然而我真的太天真,微信瀏覽器怎樣會(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è)按鈕交互。 然而我真的太天真,微信瀏覽器怎...

    _Zhao 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<