require js之define 函数
随时随地技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)
from:http://blog.csdn.net/u010130282/article/details/52329953
require js define 函数
模块不同于传统的脚本文件,它良好地定义了一个作用域来避免全局名称空间污染。它可以显式地列出其依赖关系,并以函数(定义此模块的那个函数)参数的形式将这些依赖进行注入,而无需引用全局变量。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 必须保证一致!
写在后面
GitHub上集大家之力搞了一个前端面试题的项目,里面都是大家面试时所遇到的题以及一些学习资料,有兴趣的话可以关注一下。如果你也有兴趣加入我们的话,请在项目中留言。项目同时也可以在gitbook上查看。
[InterviewLibrary-GitHub](https://github.com/springHyc/InterviewLibrary)
[InterviewLibrary-gitbook](https://hyc.gitbooks.io/interviewlibrary/content/)
require js之define 函数相关推荐
- require js define 函数
模块不同于传统的脚本文件,它良好地定义了一个作用域来避免全局名称空间污染.它可以显式地列出其依赖关系,并以函数(定义此模块的那个函数)参数的形式将这些依赖进行注入,而无需引用全局变量.RequireJ ...
- html调用js函数_使用Require.js实现模块化开发
在javascript中,我们把比较复杂的都是用模块化,今天我们就来了解一下require.js来实现模块化开发 require.js是什么? require.js是在AMD规范上实现的一个 Java ...
- html js require函数,Require.js的基本用法详解
一:什么是require.js ①:require.js是一个js脚本加载器,它遵循AMD(Asynchronous Module Definition)规范,实现js脚本的异步加载,不阻塞页面的渲染 ...
- Javascript模块化编程(三):require.js的用法
这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js. 一.为什么要用require.js? 最早的 ...
- Require.js
前言 前段时间粗略的扫过一次require.js,当时没怎么在意,结果昨天看到index里面的代码就傻了,完全不知道从哪开始看啦,所以require与backbone的学习还要加紧才行. 由于前端所占 ...
- require.js基本认识
基本API require会定义三个变量:define,require,requirejs,其中require === requirejs,一般使用require更简短 define 从名字就可以看出 ...
- require.js基本用法
1.require.js的加载 使用require.js的第一步,是先去官方网站下载最新版本. 下载后,假定把它放在js子目录下面,就可以加载了. 1 <script src="js/ ...
- require.js的用法
一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代 ...
- Javascript模块化编程require.js的用法
JS模块化工具requirejs教程(一):初识requirejs http://www.runoob.com/w3cnote/requirejs-tutorial-1.html JS模块化工具req ...
最新文章
- word2vec应用场景_Embedding在腾讯应用宝的推荐实践
- 【转帖】如何通过 javascript 访问 GridView/DataGrid 选中 CheckBox 行各列的值
- 看过漫改,但你看过「改漫」吗?AI 一键让影视变漫画
- RabbitMQ安装和运行
- 在线网上打字系统_在线网上打字比赛软件_打字练习_中英文打字系统
- iOS 仿通讯录索引
- csv 中显示逗号和双引号
- hashCode()方法的性能优化
- DHCP Option 60 的理解
- 2017中国大数据技术大会12月在京召开
- g30u盘启动 中科曙光1620_I840-G30
- Python强化训练笔记(二)——元组元素的命名
- Struts中提示Invalid result location value/parameter
- 20191222每日一句
- 南阳理工ACM 第71题
- 虚拟机用Linux安装软件
- 关联规则增量更新算法——FUP算法
- 简易理解设计模式之:组合模式——实现View中的树状结构
- 一句话,读懂首席架构师、CTO和技术总监的区别
- P1972 [SDOI2009]HH的项链 区间查询
热门文章
- Mac制作U盘系统(OS X El Capitan)教程
- eclipse Java project 项目旁边有红色感叹号
- 会议模板 Enter file name 无法生成pdf
- 苹果手机悬浮窗怎么打开_悬浮窗搜题神器_悬浮窗搜题神器app源码苹果软件预约 v1.0...
- 解析数据分析中的SAS
- 《教我兄弟学Android逆向10 静态分析反调试apk》
- Dobot桌面机械臂
- IDA7.5使用ScyllaHide反反调试
- 听说你想进腾讯总部?这项黑科技你值得拥有!
- Creo(proe)快捷键设置