JavaScript的变量作用域和闭包操作

来源:互联网 发布:80年代网络歌曲 编辑:程序博客网 时间:2024/05/20 08:02

    初次写稿,有什么技术问题,可以直接call我!

变量的作用域

        每个函数 来定义作用域,函数内部用var来声明,那么这个变量只能允许在本函数内使用,那么此时就像是骑车的班头米玻璃一样,在函数里面可以看到外面的变量,但是在函数外面却不能看到函数里面的变量;作用域之间的相互嵌套,将形成作用域链,函数的嵌套将形成闭包

  作用域

JavaScript中有两种作用域:局部作用域和全局作用域;

<script>
var func = function(){
var a = "nihao";
console.log(a);
}
var funcab = function(){
var b = "shijie";
console.log(b);
}
func();
funcab();
</script>

这一段程序现在运行是没有问题的,但是如果在funcab中让函数输出变量a,程序就会报错

    作用域链

在JAvaScript中访问一个变量时,将本地变量和参数开始,逐级向上遍历作用域直到全局作用域。

var scope = 0, zero = "global-scope";
(function(){
    var scope = 1, one = "scope-1";
    (function(){
        var scope = 2, two = "scope-2";
       (function(){
           var scope = 3, three = "scope-3";
           // scope-3 scope-2 scope-1 global-scope
           console.log([three, two, one, zero].join(" "));
           console.log(scope); // 3
        })();
       console.log(typeof three); // undefined
       console.log(scope); // 2
    })();
   console.log(typeof two); // undefined
   console.log(scope); // 1
})();
console.log(typeof one); // undefined
console.log(scope); // 0

这样的例子就相当于:你没钱花了可以找你爸爸要,然后爸爸没有,你就可以去找你爷爷,依次向上找;但是如果你爸爸没有钱,

他是不会像你要钱的;

闭包

只要存在调用内部函数的可能,JavaScript就需要保留被引用的函数,而且JavaScript运行时需要跟踪引用这个内部函数的所有变量,知道最后一个变量废弃,JavaScript的垃圾收集器才能释放相应的内存空间

闭包最大的用处有两个:函数外部的变量可以读取函数内部的变量;让这些变量的值始终保持在内存中;

function fcu(){
var n = 111;
Add = function(){
n+=1;
}
function ffs(){
alert(n);
}
return ffs;
}
var result = fcu();
result();  ///111
Add();
result();  ///112


使用闭包的注意点:由于闭包会使得函数中的变量被保存在内存中,内存消耗很大;所以不能滥用闭包,否则会造成网页的性能问题;闭包会在父函数外部改变父函数内部变量的值,不要随便改变父函数内部变量的值;









原创粉丝点击