溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

require.js中的define函數詳解

發布時間:2020-10-03 23:34:23 來源:腳本之家 閱讀:227 作者:賀賀6 欄目:web開發

前言

模塊不同于傳統的腳本文件,它良好地定義了一個作用域來避免全局名稱空間污染。它可以顯式地列出其依賴關系,并以函數(定義此模塊的那個函數)參數的形式將這些依賴進行注入,而無需引用全局變量。RequireJS的模塊是模塊模式的一個擴展,其好處是無需全局地引用其他模塊。 RequireJS的模塊語法允許它盡快地加載多個模塊,雖然加載的順序不定,但依賴的順序最終是正確的。同時因為無需創建全局變量,甚至可以做到在同一個頁面上同時加載同一模塊的不同版本。

在定義一個模塊的時候,方法的第一行寫一個“use strict”;這是干什么的?

use strict --嚴格模式,這種模式使得Javascript在更嚴格的條件下運行。

  • 消除Javascript語法的一些不合理、不嚴謹之處,減少一些怪異行為;
  • 消除代碼運行的一些不安全之處,保證代碼運行的安全;
  • 提高編譯器效率,增加運行速度;
  • 為未來新版本的Javascript做好鋪墊。

1. 簡單的值對模塊

其實就是把文件名稱作為name參數傳入,若依賴該組件那么返回的就是一個對象!

define({
 name: "hehe",
 age: "18"
});

2. 簡單的函數模塊

和上面一樣文件名稱作為默認的name,與上面的差異是,可以提前執行返回值外的代碼

define(function() {
 return {
 name: "hehe",
 age: "18"
 };
});

3. 依賴函數模塊

define([
 'angular',
 'jsUtil',
 'modules/meet/modules',
 'modules/meet/services/Meet',
 'modules/meet/services/MeetRemoteService'
],function(require) {
 'use strict';

 var module = angular.module('meet.services');

 module.factory('MeetService', function(Meet, MeetRemoteService) {
 var service = {
  name: 'hehe',
  age: '18'
 };
 return service;
 });
});

和上面一樣,關鍵是依賴模塊是以返回值作為入參的形式傳入,如果加載錯誤或者沒有找到對應的模塊,那么得到的入參是Undefiend,需要注意!

4. 返回函數模塊

define([
 'angular',
 'jsUtil',
 'modules/meet/modules',
 'modules/meet/services/Meet',
 'modules/meet/services/MeetRemoteService'
],function(require) {
 'use strict';

 var module = angular.module('meet.services');

 module.factory('MeetService', function(Meet, MeetRemoteService) {
 var service = {};
 service.getWeekOfMeet = function(weekFlag, date) {

  return MeetRemoteService.get(weekFlag, date).then(function(data) {
  data.content = Meet.sortMeet(data.content);
  return data;
  });
 }
 return service;
 });
});

和上面一樣,這里返回的是函數,在依賴模塊中把他作為函數對象調用即可,其實這是一個簡單的閉包!

5. 完整定義

define('sample3' ,['sample','sample1'],function (sample,sample1) {
 var sample4 = require('sample4');
 return function(){
 alert(sample.name+':'+sample.sayhell());
 } 
});

這就是完整定義,有名稱,有依賴,有回調,內部還有common的形式引入依賴對象!

關于define函數的name和require函數的依賴名稱之間的關系

define(name,[] , callback); 這個name可以省掉,默認是文件名稱;當然也可以自定義,一旦我們定義了name,根據源代碼我們可以發現define函數內部其實就是把這個name以及依賴模塊、回調函數作為一個對象存儲在全局的數組當中,也就是 defQueue.push([name,deps,callback]);那么這個name就是這個組件注冊的的ID!

require([name , name2],callback); 系統首先會在全文檢索path中是否對應的路徑,如果沒有自然把他作為路徑拼接在baseUrl上去異步加載這個js文件,加載時從源代碼中可以看到 ,var data = getScriptData(evt);返回的 data.id 其實就是name,然后執行contex.completeLoad(node.id) ,其內部就很清楚了,把define中注冊的name和這里得到的name進行比較如果相等就執行。所以道理就是:require 和 define 的 name 必須保證一致!

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女