作用域、闭包、匿名函数

作用域

作用域: 变量的开始创建, 到被系统回收的过程。
全局: 在任意函数以外创建的变量
局部: 在任意函数内创建的变量
ES5中: 只有函数能够生成局部作用域,其他结构不可以

作用域链: 先在当前作用域的上下文中查找,找到即执行
如果没有,继续向 上 一层查找,找到即执行。
如查找到全局中,依然没有,报错,阻断程序运行

var a = 20;
function Myfun(){
		a = 30;
		console.log(a + 10);
}
function Myfun_two(){
		a = 50;
		console.log(a + 20);
}
console.log(a); //
Myfun();		//
console.log(a); //
Myfun_two();  //
console.log(a); //

变量提升:如果使用了未声明的变量,正常情况会因为找不到而报错
但在使用的下方,出现了它的声明。 会默认将它提升到使用之前。不包括值

先使用,后声明。 该变量的 因变量提升, 可以找到,但值为undefind;
存在的意义: 保证后续任务继续执行,只是失去了 当前功能的值

            var arr = 10;
			function guangda(){
				var arr = 10;
				console.log(arr);  // 
			}
			guangda();
			console.log(arr); // 
			
			
			function xiaotao(){
				console.log(age); //
			}
			var age = 18;
			xiaotao();	

闭包

闭包的本质: 它就是个函数
概念: 能够访问其他函数内部变量的 函数

条件:

  1. 在函数中嵌套定义另外一个函数
  2. 被嵌套的函数(在里面的那个),一定要访问外部函数的变量
  3. 被嵌套的函数要返回

实现的原理: 通过作用域链
作用: 能持久化 局部变量, 手动 控制局部变量的回收时间

闭包的弊端: 不能够大批量的使用,会造成程序加载过慢. 极容易造成内存泄露

返回的方式1:

return function small(){
console.log ( c );
}

返回的方式2:

return function (){
console.log( c );
}

返回的方式3:

function small(){
console.log©;
}

return small; // 函数带着(), 是执行。 不带(), 只是定义

匿名函数

匿名函数: 没有名字的函数 实质还是一个函数

和普通函数的区别:
1.普通函数是有函数名的, 函数调用需要使用函数名
2.匿名函数没有函数名, 无法通过函数名来调用

匿名的作用:
1.匿名函数可以有效的保证在页面写入js时,不会造成全局变量的污染
2.就是可以有效的隔离作用域
3.通常我们希望这个函数,只执行一次,就结束时。使用匿名函数的自调用(也叫立即执行函数)

匿名函数调用的两种方式:

方式1 : 绑定给一个变量 或者一个事件, 通过他们来调用

// var test = function (){
// console.log(“面前有两只苍蝇”);
// }
// test(); // 变量名,充当来函数名的角色

方式2: 自调用

小括号1 : 里面存放函数的定义
小括号2 : 代表着调用函数,里面存放实参

自调用 写法一 : 官方推荐 的写法

(function (b) {
console.log(b+1);
}(20));

写法二 :

(function(a){
console.log(a+10);
})(10);

写法三:

!function () {
console.log(“我是自调用的函数”); }

写法四:

[function () {
}()]

写法五:

~function () {
}();

发布了42 篇原创文章 · 获赞 0 · 访问量 878

猜你喜欢

转载自blog.csdn.net/cybcc/article/details/105218676