日常开发知识总结(持续...)

221 阅读3分钟

1、变量提升

JS拿到一段代码或一个函数的时候,会有两步主要操作,即解析与执行。声明提升就是函数中任何位置所声明的变量或函数,都会自动“提”到函数的最前面,就好像它们是在函数的开头声明的一样。

console.log(x)
var x = 2
----------------------
输出:undefined
var x = 2  ====>  var a; a = 2,而 var a 会在 console.log() 之前就已经声明了。
声明式函数
f() // 我是函数声明2
function f () {
  console.log('我是函数声明1')
}
function f () {
  console.log('我是函数声明2')
}
var f = function () {
  console.log('我是函数声明3')
}

赋值型函数
B() // TypeError: B is not a function
var B = function () {
  console.log('B')
}
  • 所有的声明都会提升到作用域的最上面。
  • 同一个变量只会声明一次,其他的会被忽略掉。
  • 函数声明的优先级高于变量声明的优先级,并且函数声明和函数定义的部分一起被提升。
  • 解析和预编译过程中的声明提升可以提高性能,让函数可以在执行时预先为变量分配栈空间。
  • 声明提升还可以提高JS代码的容错性,使一些不规范的代码也可以正常执行。

2、闭包

定义:能够读取其他函数内部变量的函数。

function createCounter() {
   let count = 0
   const myFunction = function() {
     count = count + 1
     return count
   }
   return myFunction
}
const increment = createCounter()
const c1 = increment()
const c2 = increment()
const c3 = increment()
console.log('结果:', c1, c2, c3)

// 结果: 1 2 3
// increment()分别赋值给了c1,c2,c3,导致count变量一直被引用,无法回收。
// 为了防止内存泄漏,需将count变量回收。即将接收返回函数的变量设置为null(即c1,c2,c3设置为null)

JavaScript垃圾回收机制:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性执行。不再使用的变量也就是生命周期结束的变量,当然只可能是局部变量,全局变量的生命周期直至浏览器卸载页面才会结束。局部变量只在函数的执行过程中存在,而在这个过程中会为局部变量在栈或堆上分配相应的空间,以存储它们的值,然后在函数中使用这些变量,直至函数结束,而闭包中由于内部函数的原因,外部函数并不能算是结束。

个人理解,闭包本质上是上级作用域内变量的生命周期(内存的分配和回收),因被下级作用域内引用,所以垃圾回收机制没有将其回收,也就是该变量没有被释放,导致上级作用域的变量需等到下级作用域执行完毕才得到释放。

3、JavaScript 中 call()、apply()、bind() 的用法

作用:改变this指向。

function add(c, d){ 
  return this.a + this.b + c + d; 
} 
var o = {a:1, b:3}; 
add.call(o, 5, 7); // 1 + 3 + 5 + 7 = 16 
add.apply(o, [10, 20]); // 1 + 3 + 10 + 20 = 34 
add.bind(o, [10, 20])();  // 1 + 3 + 10 + 20 = 34 

call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数的区别在于接收参数的方式不同。
call:参数都直接传递给函数。在使用call方法时,传递给函数的参数必须逐个列举出来。
apply:传递给函数的是参数数组。
bind:除了返回是函数以外,它 的参数和 call 一样。

4、v-for中key的作用

使用v-for更新已渲染的元素列表时,默认用就地更新策略,列表数据修改的时候,会根据key值去判断某个值是否修改,如果修改,则重新渲染这一项,否则复用之前的元素。我们经常会使用index(即数组的下标)来作为key,但更推荐使用一个唯一标识来作为key,例如id。因为在diff算法中,效率会更高。