作用域
作用域: 变量的开始创建, 到被系统回收的过程。
全局: 在任意函数以外创建的变量
局部: 在任意函数内创建的变量
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:
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 () {
}();