JavaScript笔记:闭包

闭包,立即执行函数

  • 闭包
  • 立即执行函数
  • with()

闭包

闭包就是能够读取其他函数内部变量的函数

当内部函数被保存到外部时,会生成闭包,闭包会导致原有作用域链不释放,造成内存泄漏。

不同的作用域之间不能互相访问,但是如果在一个函数内部在定义一个函数并且这个内部函数与外部函数的变量有所关联,
那么就可以返回这个函数来访问外部函数里面的变量,所以在本质上闭包就是将函数内部与函数外部连接起来的桥梁。当函数执行完函数的执行上下文就会被销毁,自然就无法访问里面的变量了,但是我们这个函数返回了一个依赖于这个函数的新函数,也就是说这个没有被销毁的新函数的作用域链中存在着原本函数作用域的引用,就导致原本函数的上下文不会被销毁,返回的新函数是原本函数的闭包函数

立即执行函数

(function(){}())
只有表达式才能被执行符号’()'执行,函数声明不能被执行符号执行,被执行符号执行的表达式会放弃函数名,并成为立即执行函数.
(function(){}())实质是最外层的()将里面的函数变成表达式,所以后面的执行符号‘()’能执行该函数,所以立即执行函数不需要函数名。

function test(){console.log('test')}()//报错
var t = function test(){console.log('test')}()//打印test,但函数名test会被放弃,不再代表函数

var x = 1;
if(function f(){}) {
	// 注意:function外面加了括号,所以变成了表达式,
    // 不是函数声明,所以f会消失
    x += typeof f; //  f: undefined
    //typeof: 对于没被定义的变量,唯一不会报错的,会返回‘undefined’
   }
    console.log(x);// 1undefined

arguments.callee

  • 这个方法是指代函数本身,当在一些匿名函数或者立即执行函数里面进行递归调用函数本身的时候,由于没有名字,就用这种方式调用
  • 一般当需要通过计算来进行初始化的时候,写一个立即执行函数,当这个立即执行函数还需要递归调用自身的时候,就用这种方式调用

with()

with方法是改变作用域链,它可以吧括号里面的执行期上下文或者作用域放在自己的作用域最顶端

var obj = {a:123};
function test () {
	var a = 111;
	var b = 222;
	with(obj){
	console.log(a);   // 123
	console.log(b);   // 222
	}
}
test();

本来没有with的话,在test函数里面作用域链的最顶端应该是自身,下面才是window的作用域,但是有了with就会优先调用obj里面的a

你可能感兴趣的:(前段)