JS深入-作用域和闭包


预解析

1、变量的声明提前了–提前到当前所在的作用域的最上面
2、函数的声明也会被提前–提前到当前所在的作用域的最上面
3、注意函数声明与函数表达式的区别

实例:
// alert(num);
var num=100;//变量的声明提前了
f1();//函数的声明也可以提前
function f1(){
var nua=100;
// alert(num);
}
f2();//报错,函数声明与函数表达书不同
var f2=function(){
var nub=100;
alert(nub);
}

this几种不同的使用场景

this在执行时才能确认值,定义时无法确认

1、作为构造函数执行
2、作为对象属性执行
3、作为普通函数执行
4、call,apply,bind

如何理解作用域和作用域链

JS中没有块级作用域,函数除外
JS中有局部作用域和全局作用域

实例:
if(true){
var nuc=100;
}
// alert(nuc);
if(true){
var nud=100;
}
// alert(nud);
for(i=0;i< 5;i++){
var nue=100;
}
// alert(nue);
function f2(){
var nuf=200;
}
f2();
alert(nuf);//不能调用

作用域链

沿着作用域链一级一级的搜索的过程,搜索过程始终从作用域链底端开始,然后逐级向上回溯,直到找到为止(如果找不到,通常会报错)

对闭包的理解

优点:可以读取函数内部的变量,让这些变量的值始终保持在内存中
缺点:闭包会使得函数中的变量都被保存在内存中,内存消耗很大。所以不能滥用闭包,可能会造成网页的性能问题,在IE中可能会导致内存泄露。
闭包会在父函数外部,改变父函数内部变量的值

//简单的闭包
var nug=1;
function f3(){
// alert(nug);
}
f3();//函数内部可以直接读取变量
//复杂的闭包
//其实就是函数内部的函数
function f4(){
var nuh=2;
function f5(){
// alert(nuh);
}
return f5;
}
var result=f4();
result();


文章作者: COOL
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 COOL !
评论
  目录