猜想 多个文件中require同一个文件时,对于首次出现的require,会去读取文件并执行一遍,然后加入缓存;之后当再次require到这个文件时,只会指向这个缓存,可以理解成设置了一个指向这个缓存的指针...由于缓存的存在,因此多个地方require同一个文件,实际上都是操控同一个缓存,因此一处的修改,会影响到另一处,可以理解成全局的。 验证 main.js: var test1 = require('..../test1');调用了test1.js,其中test1.js中的var test3 = require('....中的方法,先输出了全局变量tt的值为0,然后输出修改后的值为1; 3、t2:回到main.js中继续往下执行,到了var test2 = require('.....js中也执行了test3.t3("2");调用了test3中的方法,先输出了全局变量tt的值为1,这说明第2步中修改的值被保留了,然后输出修改后的值为2; 总结:综上所述,论证了最开始的猜想
原文地址:https://dev.to/bhagatparwinder/functions-in-javascript-5ehm 什么是函数?它在 JavaScript 中扮演什么角色?...函数就是 JavaScript 中可以被执行的代码块。函数有如下必备部分: 1. 使用 function 关键字声明; 2. 函数名字紧跟其后,它就是被调用时使用的名字。 3....JavaScript 自带的函数 你不是要经常写函数,JavaScript 自带了许多可以直接使用的方法。...函数声明在其他代码执行之前被加载,然而函数表达式只有等到 JavaScript 解释器执行到所在代码行时才被加载。这就是 JavaScript 中 hoisting[1] 的原理。...,它们没有与 this、arguments、super、new.target,我们将在接下来的 JavaScript 文章中温习这写概念。
// require函数实现原理: function require(modulePath) { var regExp = /\w+$/g; var moduleName = regExp.exec...exports: {} }; var load = function (exports, module) { // ============ // 读取的文件内容
不要把秘密说给你的朋友,因为你的朋友也有朋友~ ---- 1.require()的基本用法 ---- 当Node遇到require(X)时,按照下面的顺序处理。...(1)如果X是内部模块(比如require('http')) a.返回该模块 b.不再继续执行 (2)如果X以'./'或者'/'或者'.....根据 X 所在的父模块,确定 X 可能的安装目录 b....依次在每个目录中,将X当做文件名或者目录名加载 (4)抛出"not found" 举个例子: 脚本文件/home/ry/projects/foo.js执行了require('bar'),这属于上面的第三种情况...bar/package.json(main字段) bar/index.js bar/index.json bar/index.node 如果所有目录中,都无法找到bar对应的文件或者目录,就抛出一个错误
函数能让开发者把JavaScript代码变得更有效率,而且更能重复吃用。函数解决思路:把大问题变成小问题,分割的思路。...函数Body可以访问参数,此时这些参数就像已经完成初始化工作的局部变量。 注意:函数的传递的参数很像函数内部的局部变量,但在函数内部改变函数的参数,却不影响函数外的任何事物。 具有返回值的函数。...返回值能让你从函数中返回一段数据。...前端开发原则一: 结构(html),样式(css)和行为(JavaScript)的分离。 内容:网页的HTML代码,它提供网页实际上如何拼接在一起的结构,同时也是网页数据的所在地。...外观:网页的css代码,它主要改变的内容的样式,决定字体,色彩和排版的最终效果。 功能:驱动网页、带来交互性的JavaScript代码。
关键字 没有大括号{} 在JavaScript中,函数是一等公民。...你可以把函数存储在变量中,把它们作为参数传递给其他函数,并从其他函数中把它们作为值返回。你可以使用JavaScript箭头函数来做所有这些事情。 无圆括号语法 在上述示例中,函数是没有参数的。...它们从父级继承this的值,正是因为这个特点,在上面这种情况下就是很好的选择。 不正常工作的情况 箭头函数并不只是在JavaScript中编写函数的一种花里胡哨的新方法。...,以解决JavaScript中this关键字的绑定问题。...箭头函数在数组方法中也很好用,如.map()、.sort()、.forEach()、.filter()、和.reduce()。但请记住:箭头函数并不能取代常规的JavaScript函数。
在JavaScript中,关键字 this 是一个特殊的对象引用,它指向当前执行函数的上下文对象。this的值在函数被调用时确定,并且可能根据函数的调用方式和上下文的不同而变化。...this 的规则全局上下文中的 this:在全局上下文中,this 指向全局对象(在浏览器环境中通常是 window 对象)。...console.log(this); // 输出全局对象,如 window 对象(在浏览器环境中)函数中的 this:在函数内部,this 的值取决于函数被调用的方式。...作为函数调用:如果函数作为普通函数调用,this 指向全局对象(在浏览器环境中通常是 window 对象)。...箭头函数中的 this:箭头函数的 this 值是在定义时确定的,它捕获了包含它的函数的 this 值。
this 的常见用途:访问对象属性和方法:通过使用 this,我们可以在对象方法中访问和操作对象的属性和方法。...创建和初始化对象:通过构造函数和 this,我们可以在创建对象时设置和初始化对象的属性。...console.log(john.name); // 输出 "John"console.log(john.age); // 输出 25修改执行上下文:通过使用 call() 或 apply(),我们可以在特定的上下文中调用函数...避免闭包中的问题:通过使用 this,我们可以避免闭包中的作用域问题,确保访问正确的变量和对象。...需要注意的是,this 的值在函数被调用时确定,并且在函数执行过程中可能会发生变化。了解 this 的规则和用法非常重要,以避免在代码中出现错误或意外行为。
什么是高阶函数 高阶函数是对其他函数进行操作的函数,可以将它们作为参数或通过返回它们。简单来说,高阶函数是一个函数,它接收函数作为参数或将函数作为输出返回。...在《javascript设计模式和开发实践》中是这样定义的: 1.函数可以作为参数被传递; 2.函数可以作为返回值输出。...示例 Array.prototype.map 该map()方法通过调用作为输入数组中每个元素的参数提供的回调函数来创建一个新数组。...该map()方法将从回调函数中获取每个返回值,并使用这些值创建一个新数组。传递给回调函数map()方法接受3个参数:element,index,和array。...高阶函数就像常规函数一样,具有接收和返回其他函数的附加能力,即参数和输出。
JS中的函数 声明方式 方式一 function 函数名(){ 函数体 } 方式二 var 函数名=function(){ 函数体 } 方式三 var 函数名=new...Function(“函数体”); 函数参数传递 在js中实参的个数和形参的个数可以不一致 function demo4(a,b){ console.log(a+"...."...+b); } demo4(1,2);//1....2 demo4(1);//1....undefined demo4(1,2,3);//1....2 执行方式 函数名()...; JS中的对象 类似Java中的一些系统预设好的类 日期对象 function testDate(){ var date=new Date();...,并返回新的数组。
编码函数有三个: escape、encodeURI、encodeURIComponent 主要区别: 非URI编码 :escape仅对String对象编码,不能用来对统一资源标示码URI进行编码 URI...当该编码结果被作为请求发送到 web 服务器时将是无效的,如果字符串中包含不止一个 URI 组件,请使用 encodeURI 方法进行编码。...使用encodeURIComponent 对一个url地址转码得到如下的编码后的字符串: ?...需要得到路径的不要使用encodeURIComponent ,建议使用encodeURI 如遇到特殊的需求,需要将:":"、"/"、";" 和 "?"...进行编码的,就使用encodeURIComponent
一、require() 的基本用法 分析源码之前,先介绍 require 语句的内部逻辑。如果你只想了解 require 的用法,只看这一段就够了。 下面的内容翻译自《Node使用手册》。...二、Module 构造函数 了解内部逻辑以后,下面就来看源码。 require 的源码在 Node 的 lib/module.js 文件。...Node 定义了一个构造函数 Module,所有的模块都是 Module 的实例。...然后,如果模块已经在缓存中,就从缓存取出;如果不在缓存中,就加载模块。 因此,Module._load 的关键步骤是两个。 Module....有时在项目代码中,需要调用模块的绝对路径,那么除了 module.filename ,Node 还提供一个 require.resolve 方法,供外部调用,用于从模块名取到绝对路径。
在composer install 参数中 --no-dev 当加上这个参数 composer.json文件中 require-dev中的包就不会安装了 这个在线上的时候,可以使用,这样就不会把开发中需要的包按到线上...require中所引用的包在线上和开发环境均会使用 require-dev中的包只在本地开发的时候使用,线上运行不会使用的包 ?...同样 --no-dev也会忽略 autoload-dev指定的命名空间
在RequireJS中,你可以使用 require 函数来异步地加载一个或多个模块,并在这些模块加载完成后执行一个回调函数。这个回调函数会接收这些模块作为参数。...// ... }); 另外,在模块的顶层(不在其他函数中),你也可以使用 require 语句来同步地加载一个模块。...作用域:define 是在模块文件中使用的,用于定义模块的导出值;而 require 可以在任何JavaScript文件中使用,用于加载模块并在回调函数中使用它们。...正确的异步加载方式 RequireJS 提供了异步加载模块的方式,通过 require 函数并传递一个回调函数: // 假设这是你的主JavaScript文件 main.js require(['myModule...of module load status.'); 在上面的代码中,require 函数会异步地加载 myModule,并在模块加载完成后调用提供的回调函数。
JavaScript函数: 也称为方法,用来存储一块代码,需要的时候调用。 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。...JavaScript中的函数定义: //定义函数jiSun function jiSuan(){ alert("这是函数jiSuan"); } //调用函数...function是定义函数,并不会执行,调用函数时才会寻找该函数名的定义内容。 JavaScript中函数的定义和调用先后顺序可以先写调用在写定义。...(3); JavaScript中的常用函数: document.write(""); 输出语句 Math.random();获取0-1之间的随机数 document.write(Math.random...如果查找成功,返回字符串中匹配的索引值。否则返回 -1 。
compose函数 compose函数可以将需要嵌套执行的函数平铺,嵌套执行就是一个函数的返回值将作为另一个函数的参数。...res = calculate(10); console.log(res); // 200 但是根据我们之前讲的函数式编程,我们可以将复杂的几个步骤拆成几个简单的可复用的简单步骤,于是我们拆出了一个加法函数和一个乘法函数...: const add = x => x + 10; const multiply = x => x * 10; // 我们的计算改为两个函数的嵌套计算,add函数的返回值作为multiply函数的参数...compose实现的,webpack中loader的加载顺序也是从右往左,这是因为他也是compose实现的。...pipe函数 pipe函数跟compose函数的作用是一样的,也是将参数平铺,只不过他的顺序是从左往右。
函数字面量(function literal):处理事件的无名函数(nameless function)。函数字面量有时也称为匿名函数(anonymous function)。...可以在onload事件完成所有事件的初始化。 函数字面量最好只被调用一次,而且不是被开发者写的程序代码调用。创建一个函数字面量并直接指派给一个元素的事件属性,而不是创建有名称的函数并指派到它的引用。...如果在代码中不需要函数引用时,为了编写程序的效率,同时不想中规中矩为函数命名,函数字面量(匿名函数)才显得有必要。 匿名函数调用: 调用一个函数,必须有方法定位它,找到它。...第二种情况: javascript"> window.onload = function () { alert("I have been called...匿名函数的生命周期和window.onload有内在的关系吗?
定义 惰性载入函数表示函数执行的分支仅会发生一次,有两种实现惰性载入函数的方式,第一种是在函数被调用时再处理,在第一次调用中,该函数会覆盖为另外一个按合适方式执行的函数,这样任何对函数的调用都不用再经过执行的分支了...实际上,当我们用某个浏览器打开网页时,就决定了某个if分支或try语句是可用的,没有必要每次调用都检查。为了解决以上问题,JavaScript中出现一种名为惰性载入的技巧。...,通过var来定义函数,在每个if分支中return一个函数。...优势 惰性载入函数有两个主要优点,第一是显而易见的效率问题,虽然在第一次执行的时候函数会意味赋值而执行的慢一些,但是后续的调用会因为避免的重复检测更快;第二个是要执行的适当代码只有当实际调用函数是才执行...,很多JavaScript库在在加载的时候就根据浏览器不同而执行很多分支,把所有东西实现设置好,而惰性载入函数将计算延迟,不影响初始脚本的执行时间。
函数式编程 函数式编程是一种编程范式,是一种构建计算机程序结构和元素的风格,它把计算看作是对数学函数的评估,避免了状态的变化和数据的可变,与函数式编程相对的是命令式编程。...纯函数 纯函数是指一个函数,如果它的调用参数相同,则永远返回相同的结果。它不依赖于程序执行期间函数外部任何状态或数据的变化,只依赖于其输入参数。...同时函数的运行也不改变任何外部数据,它只通过它的返回值与外部通讯。...不纯的函数可能会带来副作用。 函数副作用 函数副作用是指调用函数时除了返回函数值之外,还对主调用函数产生附加的影响,比如修改全局变量或者外部变量,或者修改参数。...我们的目标是尽可能的减少副作用,将函数写为纯函数,下面这个不纯的函数使用了new Date,每次运行结果不一样,是不纯的: ?
符合模块化概念及单一职责原则 高阶函数 在我们的编程世界中,我们需要处理的其实也只有“数据”和“关系”,而关系就是函数 编程工作也就是在找一种映射关系,一旦关系找到了,问题就解决了,剩下的事情,就是让数据流过这种关系...减少代码量,提高维护性 缺点: 性能:函数式编程相对于指令式编程,性能绝对是一个短板,因为它往往会对一个方法进行过度包装,从而产生上下文切换的性能开销 资源占用:在 JS 中为了实现对象状态的不可变,往往会创建新的对象...,因此,它对垃圾回收所产生的压力远远超过其他编程方式 递归陷阱:在函数式编程中,为了实现迭代,通常会采用递归操作 参考文献 https://zhuanlan.zhihu.com/p/81302150 https...://zh.wikipedia.org/zh-hans/%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B 推荐阅读:JavaScript 中的内存泄漏一张动图理解...11个 Javascript 代码优化小技巧 VUE中文社区 编程技巧 · 行业秘闻 · 技术动向