导 读 面试真题,用通俗的例子解释清楚 MySQL 为什么有了表锁和行锁之后,还要引入意向锁 众所周知,InnoDB 中既有读锁也有写锁,也称为共享锁和排他锁,这两种锁既可以加在整张表上,也可以加在行上...看下面这个例子: 事务 A 加了行级读锁,锁住了表中的一行,让这一行只能读,不能写。 之后,事务 B 尝试申请整个表的写锁。...那数据库要怎么判断这个冲突呢?...(行级写锁)时,InnoDB 存储引擎会自动地先获取该表的意向写锁(表级锁) 注意这里的自动:申请意向锁的动作是数据库完成的,就是说,事务 A 申请一行的行锁的时候,数据库会自动先开始申请表的意向锁,不需要我们程序员使用代码来申请...也就是说原先步骤 2 的遍历表中每一行的操作,简化成了判断下整张表上有无表级意向锁就行了,效率大幅提升。 这就是为什么要有意向锁了。 End.
模块 模块是比对象和函数更大的代码单元。使用模块可以将程序进行归类。为什么需要模块?...在有些时候,js中可能都是全局变量(如果你在主线程代码中定义变量,该变量会被自动识别为全局变量),并且可被其他部分的代码访问。当,程序开始扩展,引入第三方代码后,命名冲突的可能性就会大大提高。...上面的例子中,模块MouseCounterModule依赖于JQuery,因此AMD首先请求JQuery模块,如果需要从服务端请求,那么请求上需要时间。同时,这个过程是异步的,可以避免阻塞。...剩下的模块代码与标准的Javascript无大差异。同时,只需要使用require函数引用模块。 CMD是NodeJS默认的模块格式。 CMD缺点 不能显式支持浏览器。...import A from 'a.js' ; //导入模块 A.sayHello(); 注意: 导入已经命令的导出内容,必须使用花括号 导入默认的导出不需要使用花括号 重命名:只能在export/
模块插件:通过 `` 或 import 导入后,改变另一个模块的结构 全局变量§ 全局变量是最简单的一种场景,之前举的例子就是通过 `` 标签引入 jQuery,注入全局变量 $ 和 jQuery。...selector: string) => any; // src/index.ts jQuery('#foo'); // 使用 declare let 定义的 jQuery 类型,允许修改这个全局变量...// 使用 declare const 定义的 jQuery 类型,禁止修改这个全局变量 jQuery = function(selector) { return document.querySelector...比如 jQuery 是一个全局变量,它是一个对象,提供了一个 jQuery.ajax 方法可以调用,那么我们就应该使用 declare namespace jQuery 来声明这个拥有多个子属性的全局变量...注意 module 配置可以有很多种选项,不同的选项会影响模块的导入导出模式。这里我们使用了 commonjs 这个最常用的选项,后面的教程也都默认使用的这个选项。
库后,改变一个全局变量的结构模块插件:通过 或 import 导入后,改变另一个模块的结构全局变量全局变量是最简单的一种场景,之前举的例子就是通过 标签引入 jQuery...: string) => any;// src/index.tsjQuery('#foo');// 使用 declare let 定义的 jQuery 类型,允许修改这个全局变量jQuery = function... 定义的 jQuery 类型,禁止修改这个全局变量jQuery = function(selector) { return document.querySelector(selector);};/...比如 jQuery 是一个全局变量,它是一个对象,提供了一个 jQuery.ajax 方法可以调用,那么我们就应该使用 declare namespace jQuery 来声明这个拥有多个子属性的全局变量...注意 module 配置可以有很多种选项,不同的选项会影响模块的导入导出模式。这里我们使用了 commonjs 这个最常用的选项,后面的教程也都默认使用的这个选项。
js的立即执行函数(IIFE)有两种写法,分别为:(function ( ){})( ) 与 (function ( ){}( )) ,这两种写法基本上是没有区别的。 那么为什么要 IIFE?...闭包和私人数据 IIFE的另一个用例是围绕由IIFE返回的函数访问的局部变量提供包装范围。通过这种方式,即使函数在IIFE的词法范围外执行,也会创建一个闭包,使函数能够访问局部变量。...uniqueId()); // "id_1" console.log(uniqueId()); // "id_2" console.log(uniqueId()); // "id_3" 注意,在IIEF之外无法访问这个计数变量...变量重命名 有时,你可能碰到一种情况,你正在使用的两个不同的库暴露的全局变量名是相同的。例如,考虑一下你正在使用jQuery同时另一个库也指定了一个为$的全局变量。...为了解决命名冲突问题,可以将一段代码封装在一个IIEF中,将一个全局变量(比如,jQuery)作为参数传入IIFE。
——《JavaScript高级程序设计》 2.为什么要使用闭包? 原因:Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。 但是在函数外部自然无法读取函数内的局部变量。...这样的做法,被总结称为 闭包。 那么如何能访问或修改到一个函数内部的变量呢? 函数的return就是这个传送门,可以将一个内部函数送出外部函数。...(在什么场景下用到它呢,就是问它解决的什么问题) 1.不必为函数命名,避免污染全局变量; 2.提供对局部变量的间接访问,按需求进行共享和长期保存; 3.维持变量,使其不被垃圾回收。...怎么解决闭包产生的内存泄露? 内存泄露是指你用不到(访问不到)的变量,依然占居着内存空间,不能被再次利用起来。 闭包产生的内存泄露怎么办?...由于jQuery考虑到了内存泄漏的潜在危害,所以它会手动释放自己指定的所有事件处理程序。 只要坚持使用jQuery的事件绑定方法,就可以一定程度上避免这种特定的常见原因导致的内存泄漏。
随着网站功能逐渐丰富,网页中的js也变得越来越复杂和臃肿,原有通过script标签来导入一个个的js文件这种方式已经不能满足现在互联网开发模式,我们需要团队协作、模块复用、单元测试等等一系列复杂的需求。...deps: ['jquery'] } } }); 这里的 define 是requirejs提供的函数。...requirejs一共提供了两个全局变量: requirejs/require: 用来配置requirejs及载入入口模块。...如果其中一个命名被其它库使用了,我们可以用另一个 define: 定义一个模块 使用 shim shim是将依赖中的全局变量暴露给requirejs,当作这个模块本身的引用。...如果我们选择了把它 export 给requirejs,那当我们的代码依赖于 hello 模块的时候,就可以拿到这个 hello 函数的引用了。
虽然这个模式的写法比较难看,但是,它同时兼容了AMD和CommonJS,而且还支持老式的全局变量规范。 什么是JS模块化 先想一想,为什么模块很重要?...随着网站功能逐渐丰富,网页中的js也变得越来越复杂和臃肿,原有通过script标签来导入一个个的js文件这种方式已经不能满足现在互联网开发模式,我们需要团队协作、模块复用、单元测试等等一系列复杂的需求。...jquery 在使用requirejs时,加载模块时不用写.js后缀的,当然也是不能写后缀 上面例子中的callback函数中发现有$参数,这个就是依赖的jquery模块的输出变量,如果你依赖多个模块,...如上面的data-main="js/main"设定后,我们在使用require(['jquery'])后(不配置jquery的paths),require会自动加载js/jquery.js这个文件,而不是...定义模块,比如hello.js: function sayHello() { alert("hello"); } 我们要使用shim ,将某个依赖中的某个全局变量暴露给requirejs,当作这个模块本身的引用
\n\n## 非相对导入\n\n在了解了相对路径的加载方式之后,我们来看看关于所谓的非相对导入是 TS 是如何解析的。...\n\n大多数时候一些库提供的泛型参数其实并不能很好的满足我们的需求,所以利用 *.d.ts 扩展第三方库在业务中是非常常见的需求。\n\n废话不多说了~我们正式进入正文。...\n\n比如 jquery 中声明了对应的 declare namespace JQuery ,那么我们同样可以在自己的声明文件中使用这个依赖:\n\n\n/// <reference types="<em>jquery</em>...\n\n之所以上边<em>的</em>用例能通过三斜线指令正常<em>的</em>使用 <em>JQuery</em> <em>全局变量</em>,是因为在 <em>jquery</em> <em>的</em>声明文件中声明了全局<em>的</em> namespcae <em>JQuery</em>。...\n\n所以我们在代码中才可以正常<em>的</em>使用 <em>JQuery</em> <em>这个</em><em>全局变量</em>。
但是反过来,用typescript语法编写的代码,却不能在浏览器或者Node环境下直接运行,因为typescript本身并不是Ecmascript标准语法。 3. 为什么要使用Typescript?...设置为any类型后,相当于告诉typescript编译器跳过这个变量的检查,因此可以访问、设置这个变量的任何属性,或者给这个变量赋任何值,编译器都不会报错。...声明语法: declare var、declare let、declare const声明全局变量 // src/jQuery.d.ts declare let jQuery: (selector: string...全局变量 // src/jQuery.d.ts declare namespace jQuery { function ajax(url: string, settings?...模块声明文件中的declare关键字不能声明全局变量。
/ZipCodeValidator"; let myValidator = new ZCV(); 复制代码 将整个模块导入到一个变量,并通过它来访问模块的导出部分 import * as validator...比如,像JQuery这样的类库可能有一个默认导出 jQuery或$,并且我们基本上也会使用同样的名字jQuery或$导出JQuery JQuery.d.ts declare let $: JQuery;...为了让这个模块工作,一定要注意 import定义的标识符只能在表示类型处使用(不能在会转换成JavaScript的地方) 为了确保类型安全性,我们可以使用typeof关键字。...这些库可以通过导入的形式或全局变量的形式访问。...复制代码 它同样可以通过全局变量的形式使用,但只能在某个脚本(指不带有模块导入或导出的脚本文件)里 mathLib.isPrime(2); 复制代码 创建模块结构指导 尽可能地在顶层导出 用户应该更容易地使用你模块导出的内容
jQuery 的类型 declare var jQuery: (selector: string) => any; jQuery('#foo'); 参考:http://ts.xcatliu.com/...public 修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是 public 的 private 修饰的属性或方法是私有的,不能在声明它的类的外部访问 protected 修饰的属性或方法是受保护的..."allowUmdGlobalAccess": true, // 允许在模块中全局变量的方式访问umd模块 "moduleResolution": "node", // 模块解析策略,...故当我们在书写一个全局变量的声明文件时,如果需要引用另一个库的类型,那么就必须用三斜线指令 当我们需要依赖一个全局变量的声明文件时,当我们需要依赖一个全局变量的声明文件时,由于全局变量不支持通过 import...导入,当也就必须使用三斜线指令来引入 拆分声明文件,当我们的全局变量的声明文件太大时,可以通过拆分为多个文件,然后在一个入口文件中将它们一一引入,来提高代码的可维护性。
但是这些文件的顺序还不能出错,比如jquery需要先引入,才能引入jquery插件,才能在其他的文件中使用jquery。...根据这个规范,每一个文件就是一个模块,其内部定义的变量是属于这个模块的,不会对外暴露,也就是说不会污染全局变量。...shim:{ //这个键名为要载入的目标文件的文件名,不能随便命名否则拿不到改文件对外提供的接口的 'moduleE':{ exports:'moduleE...引入seajs的时候最好给标签加个id,可以快速访问到这个标签(我是在模块合并时用到它的) 还有前面提到的使用seajs.use()在.html页面上写js时如果有多个模块依赖,需要使用暴露出来的接口就要让参数与它一一对应...模块 shim:{ //这个键名为要载入的目标文件的文件名,不能随便命名否则拿不到改文件对外提供的接口的 'moduleE':{ exports
一、JQuery将window对象最为参数传入函数域,从而使window对象成为JQuery函数域的局部变量,这样做的好处是: 1.访问局部变量比访问全局变量的代价花销低很多,JQuery访问局部window...对象时,不必通过作用域链调回全局来访问,从而更加快速的访问window对象。...与null不同,undefined并不是一个数据类型,而是一个预定义的全局变量(参照JavaScript权威指南44页),它是可以被修改的(并不是所有浏览器都支持)。...JQuery将undefined作为参数传入函数域,一方面是为了代码压缩优化;另一方面是为了防止修改undefined的行为影响JQuery作用域,确保在JQuery作用域内,undefined就是undefined...三、自调用匿名函数的分号不能省略。
// 所以通过这个方法生成的实例 this 所指向的仍然是 jQuery.fn,所以能正确访问 jQuery 类原型上的属性与方法 jQuery.fn.init.prototype = jQuery.fn...,是否是重载,为什么要这样写,一定会有不一样的收获。...其次,也是因为这个原因,jQuery 源码存在许多兼容低版本的 HACK 或者逻辑十分晦涩繁琐的代码片段,浏览器兼容这样的大坑极其容易让一个前端工程师不能学到编程的精髓,所以不要太执着于一些边角料,即使兼容性很重要...jQuery 变量冲突处理 最后想提一提 jQuery 变量的冲突处理,通过一开始保存全局变量的 window.jQuery 以及 windw.$ 。...那么让出了这两个符号之后,是否就不能在我们的代码中使用 jQuery 或者呢 $ 呢?
,这也是很多人诟病CMD的一点,牺牲性能来带来开发的便利性,实际上解析模块用的时间短到可以忽略 为什么我们说两个的区别是依赖模块执行时机不同,为什么很多人认为ADM是异步的,CMD是同步的(除了名字的原因...适用场景:浏览器或服务器环境 用法: 无导入导出规范,只有如下的一个常规写法: (function (root, factory) { if (typeof define === 'function...== 'object') { //Node, CommonJS之类的 module.exports = factory(require('jquery')); }...else { //浏览器全局变量(root 即 window) root.returnExports = factory(root.jQuery); } }(this...,不能在代码块之中(如:if语句中),import()语句可以在代码块中实现异步动态按需动态加载 适用场景:浏览器或服务器环境(以后可能支持) 用法: 1、导入:import {模块名A,模块名B…}
配置了按需引入 polyfill 后,用到 es6 以上的函数,babel 会自动导入相关的 polyfill,这样能大大减少 打包编译后的体积。...其原理就是把网页依赖的基础模块抽离出来打包到 dll 文件中,当需要导入的模块存在于某个 dll 中时,这个模块不再被打包,而是去 dll 中获取。 安装 jquery,并在入口文件引入。...12、使用 happypack 并发执行任务 运行在 Node 之上的 Webpack 是单线程模型的,也就是说 Webpack 需要一个一个地处理任务,不能同时处理多个任务。...做一个缓存,当服务器挂了之后,你依然能够访问这个网页 ,这就是 PWA。...,然后关闭这个服务器,你会惊讶的发现:网站竟然还能够访问,哈哈,是不是很神奇?
这个报错是因为 ESLint 推荐用 ES6 方法来拼接字符串,而不能使用加号, 如下: // bad code const name = 'dooring' + version; // good code...react 版本的依赖, 这个问题我们可以通过执行: npm ls react 来获取线索, 那为什么会存在两个版本呢?..."allowUmdGlobalAccess": true, // 允许在模块中全局变量的方式访问umd模块 "moduleResolution": "node", // 模块解析策略,...ts默认用node的解析策略,即相对的方式导入 "baseUrl": "./", // 解析非相对模块的基地址,默认是当前目录 "paths": { // 路径映射,相对于baseUrl...// 如使用jq时不想使用默认版本,而需要手动指定版本,可进行如下配置 "jquery": ["node_modules/jquery/dist/jquery.min.js"]
下面介绍两种方式: 1.使用 render_to_string 加载 html 我们提前准备好一个 html 页面index.html,然后为了方便 views 中能成功访问到这个index.html,...使用 render 加载 html 这里我们需要从django.shortcut导入 render 模块,一般情况下 Django 会默认导入这个模块,views 中如果没有的话就手动导入一下: from...什么是静态文件 不能与服务器做动态交互的文件叫静态文件;对于 HTML 中的图片、视频、css、js 这些都属于静态文件。Django 对于这些文件有一套明确的管理机制。...# 必须确保安装静态模块 然后使用STATICFILES_DIRS这个全局变量来存储静态文件的路径。...直接访问静态文件 在 Django 配置的文件 settings.py 中有一个全局变量STATIC_URL,它定义了一个给外界用户直接访问静态文件的路径。
esbuild中有一个选项为bundle: true 这个选项会将需要打包的入口文件的依赖进行全部打包,比如:我导入elementui,那么他就会将所有element需要的依赖统统打入到内部。(重要!...比如a.js引入了 xxx.js将原本的导出的ceshi这个值修改成了2,那么当b.js引入的时候获取到ceshi这个值也是2而不是最开始的值了。...vite为什么可以预处理分析 这个答案其实很简单了,因为vite需要在入口的html中添加type="module"的script导入,然后将匹配script引入的导入作为esbuild的入口文件,这样...", jQuery: "jquery" }, styleLoader: { less: [path.resolve(__dirname...作为一个新的脚手架内容,我认为提高开发效率以及项目稳定性是最重要的,这也是为什么没有一昧的进行强行替换vite作为生产,当出现问题的时候可以直接使用webpack进行处理。
领取专属 10元无门槛券
手把手带您无忧上云