1、修改Chrome记住密码后自动填充表单的黄色背景
- 产生原因:由于Chrome默认会给自动填充的input表单加上 input:-webkit-autofill 私有属性造成的
- 解决方案1:在form标签上直接关闭了表单的自动填充:
autocomplete="off"
- 解决方案2:
input:-webkit-autofill { background-color: transparent; }
2、display:inline-block 会显示间隙的原因和解决办法:
- 相邻的 inline-block 元素之间有换行或空格分隔的情况下会产生间距
- 非 inline-block 水平元素设置为 inline-block 也会有水平间距
- 可以借助 vertical-align:top; 消除垂直间隙
- 可以在父级加 font-size:0; 在子元素里设置需要的字体大小,消除垂直间隙
- 把 li 标签写到同一行可以消除垂直间隙,但代码可读性差
3、常见的全局函数
• decodeURI() 解码某个编码的 URI。
• decodeURIComponent() 解码一个编码的 URI 组件。
• encodeURI() 把字符串编码为 URI。
• encodeURIComponent() 把字符串编码为 URI 组件。
• escape() 对字符串进行编码。
• eval() 计算 JavaScript 字符串,并把它作为脚本代码来执行。
• isFinite() 检查某个值是否为有穷大的数。
• isNaN() 检查某个值是否是数字。
• Number() 把对象的值转换为数字。
• parseFloat() 解析一个字符串并返回一个浮点数。
• parseInt() 解析一个字符串并返回一个整数。
• String() 把对象的值转换为字符串。
• unescape() 对由escape() 编码的字符串进行解码
4、AMD,CMD
CommonJS是服务器端模块的规范,Node.js采用了这个规范。CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。AMD规范则是非同步加载模块,允许指定回调函数
AMD推荐的风格通过返回一个对象做为模块对象,CommonJS的风格通过对module.exports或exports的属性赋值来达到暴露模块对象的目的
es6模块 CommonJS、AMD、CMD
CommonJS 的规范中,每个 JavaScript 文件就是一个独立的模块上下文(module context),在这个上下文中默认创建的属性都是私有的。也就是说,在一个文件定义的变量(还包括函数和类),都是私有的,对其他文件是不可见的。
CommonJS是同步加载模块,在浏览器中会出现堵塞情况,所以不适用
AMD 异步,需要定义回调define方式
es6 一个模块就是一个独立的文件,该文件内部的所有变量,外部无法获取。如果你希望外部能够读取模块内部的某个变量,就必须使用export关键字输出该变量 es6还可以导出类、方法,自动适用严格模式
5、闭包理解
- 全局变量和局部变量
js的特色:函数内部可以访问全局变量,但是函数外部不能访问函数内部的局部变量 - 闭包:能够读取其他函数内部的变量(可以:定义在函数内部的函数,将函数内部和函数外部连接起来的桥梁)
特点: 1、能够读取其他函数内部的变量2、这些变量始终保持在内存中,不会在调用后被清除掉(垃圾回收机制)
总结:局部变量无法共享和长久的保存,而全局变量可能造成变量污染,希望一种机制,可以长久的保存变量又不会造成全乎污染
Eg:
Function f1(){
Var a = 10
Function f2(){
a++
Console.log(a)
}
Return f2()
}
Var f= f1() //f才是闭包
f() //11
把f1的执行结果(即f2)赋值给全局变量f,这样就存在内存中不会被回收,而在f2中又存在对f1中局部变量a的引用,这样就形成了闭包
6、setTimeout
- 定时器,用来指定某个函数在多少毫秒之后执行。它会返回一个整数,表示定时器的编号,同时你还可以通过该编号来取消这个定时器。
- 执行过程:要执行一段异步任务,需要先将任务添加到消息队列中。不过通过定时器设置回调函数有点特别,它们需要在指定的时间间隔内被调用,但消息队列中的任务是按照顺序执行的,所以为了保证回调函数能在指定时间内执行,你不能将定时器的回调函数直接添加到消息队列中。
在 Chrome 中除了正常使用的消息队列之外,还有另外一个消息队列,这个队列中维护了需要延迟执行的任务列表,包括了定时器和 Chromium 内部一些需要延迟执行的任务。所以当通过 JavaScript 创建一个定时器时,渲染进程会将该定时器的回调任务添加到延迟队列中。 - 使用 setTimeout 的一些注意事项:
- 如果当前任务执行时间过久,会影延迟到期定时器任务的执行
- 如果 setTimeout 存在嵌套调用,那么系统会设置最短时间间隔为 4 毫秒(定时器函数里面嵌套调用定时器,也会延长定时器的执行时间)是因为在 Chrome 中,定时器被嵌套调用 5 次以上,系统会判断该函数方法被阻塞了,如果定时器的调用时间间隔小于 4 毫秒,那么浏览器会将每次调用的时间间隔设置为4 毫秒
- 未激活的页面,setTimeout 执行最小间隔是 1000 毫秒。标签不是当前的激活标签,那么定时器最小的时间间隔是 1000 毫秒,目的是为了优化后台页面的加载损耗以及降低耗电量。
- 延时执行时间有最大值(大约 24.8 天)。Chrome、Safari、Firefox 都是以 32 个 bit 来存储延时值的,32bit 最大只能存放的数字是 2147483647 毫秒,这就意味着,如果 setTimeout 设置的延迟值大于 2147483647 毫秒(大约 24.8 天)时就会溢出,这导致定时器会被立即执行。
- 使用 setTimeout 设置的回调函数中的 this 不符合直觉。该方法中的 this 关键字将指向全局环境,而不是定义时所在的那个对象。
第一种是将MyObj.showName放在匿名函数中执行。第二种是使用 bind 方法,将 showName 绑定在 MyObj 上面(setTimeout(MyObj.showName.bind(MyObj), 1000))