作用域,作用域链,预解析
变量:局部变量、全局变量
作用域:变量的使用范围
js中没有块级作用域,一对括号中定义的变量,这个变量可以在大括号外面使用,但函数中定义的变量是局部变量
{
var num=10;
}
这就是个全局变量
作用域链:变量的使用,从里向外,层层的搜索,搜索到了就可以直接使用了,但如果搜索到了0级作用域的时候还没有找到这个变量,结果就报错。
预解析:在浏览器解析代码之前,把变量的声明和函数的声明提前到该作用域的最上面。
闭包
闭包的概念:函数A中,有一个函数B,函数B中可以访问函数A中定义的变量或者是数据,此时形成了闭包。
闭包的模式:函数模式的闭包、对象模式的闭包
函数模式的闭包:
function fun1 (){
var num = 100;
function fun2 (){
console.log(num);
}
fun2();
}
fun1();
function fun1 (){
var num = 100;
return function fun2 (){
return num;
}
}
console.log(fun1()());
对象模式的闭包:
function fun1 (){
var num = 100;
var obj = {
age:num
}
console.log(obj.age)
}
fun1();
function fun1 (){
var num = 100;
return {
age:num
}
}
console.log(fun1().age);
闭包的作用:缓存数据、延长作用域链
function bibao (){
var num = 10;
return function(){
num++;
return num;
}
}
var ffBb = bibao();
console.log(ffBb());
console.log(ffBb());
console.log(ffBb());
输出的值分别为11,12,13 bibao()这个方法只执行了一次,也就是说num=10这个只执行了一次,但是ffBb()这个方法执行了三次。
总结:如果想要缓存数据,就把这个数据放在外层的函数和里层的函数的中间位置
闭包的优点和缺点:缓存数据
局部变量时在函数中的,当函数执行完之后,局部变量就会被释放(这个操作是浏览器执行的),闭包后,里面的局部变量使用的作用域链就会被延长,不能及时的释放。
沙箱
在一个虚拟的环境中模拟真实世界,在虚拟环境中做操作,不会影响真实的世界。
啥玩意?
其实相当于开辟了一个局部环境,在这个环境里边的变量不会影响外边环境的同名变量。
想到了啥,恩,自调用函数
(function (){…})();
(function (){…}());
网友评论