js中的闭包问题、call/apply/bind 区别
函数中的局部变量当函数执行完成之后,局部变量就会被销毁
垃圾回收机制,将不需要使用数据进行清除,如果不清除就会造成内存泄漏
闭包:
函数套函数,执行外部函数时返回内部函数
并且内部函数有权调用外部函数作用域中局部变量
当引用js文件中变量名相同时,我们把这种叫做变量污染
闭包会产生私有变量的存在,解决变量污染问题
但是也会产生内存泄漏
// 常见闭包
function fn(){
var a = 1;
function fn1(){
a++
console.log(a)
}
return fn1 //返回fn1函数,不执行
}
var f=fn()
f() // 2 执行一次fn1
f() // 3 再执行一次
//重构bind()
//外部函数,对obj进行操作,obj加上对应的参数
function fn(a,b){
this.a += a;
this.b += b;
return console.log(this.a,this.b)
}
Function.prototype.mybind = mybind;
function mybind(fn,thisArg){ //fn 是需要改变this指向的外部函数,thisArg 是外部函数this的指向
return function (){
return fn.apply(thisArg,arguments)
}
}
var obj = {a:1,b:2}
var f=mybind(fn,obj)
f(10,10) // 11 ,12
/* 同上面的等同
function mybind(thisArg){
var f = this //把this存起来 ,这里的this指向调用mybind函数的外部函数
console.log(this)
return function (){
return f.apply(thisArg,arguments)
}
}
var obj = {a:1,b:2}
var f=fn.mybind(obj)
f(10,10)
console.log(obj)
*/
call /apply/bind 区别
call(this指向,参数1,参数2,参数…)
apply(this指向,[参数1,参数2,参数…])
call和apply两个方法改变this的指向后原函数会立即执行,而且这个时候知识临时改变this的指向
bind(this指向)(参数1,参数2,…参数n) //返回值是一个function
bind改变this指向后不会立即执行,而是返回一个永久改变this
指向的函数