作用域:
作用域,即为变量开始创建到被系统回收的可使用区域
- 全局作用域:在函数外创建或声明的变量,可在整个文件中获取/修改
- 局部作用域:在函数内创建或声明的变量,仅可在该函数中使用,函数运算结束后收回
- 块级作用域:被一对花括号包括的区域,性质与局部作用域相同(是ES6新增的功能)
-
ES5中,只有函数可以生成局部作用域
作用域链:
先在当前作用域中新招,找到即执行,如果没有找到,则向上一级查找,找到就执行,如果没找到则继续往上一级查找,如果全局都没有找到,则返回报错并阻断程序运行
变量提升:
console.log(a) 收变量提升影响,之后有a所生命的变量空间可以找到,但值为underfind
var a = 10; 受变量提升的影响,之前的a可以找到变量空间,但不包括赋值的10
先使用变量,后声明,该变量因为变量提升的原因可以被找到,但是其值为underfind
意义:保证程序可以继续运行,只是失去当前功能的值
闭包
闭包的本质是函数
用于访问其他函数内部变量的函数
闭包条件:
- 在函数中嵌套定义另一个函数
- 被嵌套函数一定要访问外部函数的变量
- 被嵌套函数要返回(返回函数,而不只是变量)
原理:作用域链
作用:久化局部变量,手动控制局部变量的回收时间
弊端:不能大批量使用(大批量使用会造成程序加载过慢,容易内存泄露)
方法1:
function big( ){
var c = 10;
return function small( ){
console.log( c );
}
}
方法2:
function big( ){
var c = 10;
return function( ){
console.log( c );
}
}
方法3:
function big( ){
var c = 10;
function small( ){
console.log( c );
}
return small;
}
匿名函数
定义:匿名函数本质上还是函数,只是没有函数名
与普通函数的区别:由于没有函数名,所以调用时不能通过函数名来调用
作用:可以有效保证页面写入js时不会造成全局变量污染,有效隔离作用域
使用场景:通常在函数仅执行一次就结束时通过自调用来使用
调用方式::
- 绑定给变量或事件
var fun = function( ) { 函数体 }
div.onclick = function( ) { 函数体 }
- 自调用
自调用写法1:(推荐使用)
(function(a) {
console.log(a+10);
}(20));
自调用写法2:
(function (a){
console.log(a+10);
})(10);
自调用写法3:
!function (){
console.log("a");
}
自调用写法4:
[function () {
}()]
自调用写法5:
~function () {
}()
第一个括号存放函数定义,第二个函数代表调用函数,里面存放实参
本文均属个人理解