Javascript作用域和闭包

来源:互联网 发布:微博登录绑定域名 编辑:程序博客网 时间:2024/06/04 19:51

一、作用域

想知道作用域,我们得先了解什么是执行上下文。
首先,通过一段小案例看看。

<script type="text/javascript">      console.log(a);    var a = 100;    fn('小明');    function fn(name){        age = 20;        console.log(name,age);        var age;    }

看看运行之后的效果图。
这里写图片描述

为什么?其实是这样,网页加载js文件的时候是从头开始的,当执行console打印语句时,找不到a,所以先赋值给undefined,然后全局找变量a包括函数体fn,将a提取出来,fn也提取出来。都提取出来之后,fn已经预加载了,所以fn(“小明”),就能够打印正常了。这就是执行上下文。

Javascript中的作用域的原则

无块级作用域
有函数作用域和全局作用域

无块级作用域

比如JAVA中,

if(name=="小明"){    int a = 100;}System.out.pritln(a);//出错!XXXX  无法打印出a的值

而javascript中则可以

if(name=="小明"){    var a = 100;}console.log(a) //成功打印

这就是javascript和java的区别。

函数作用域和全局作用域

比如这段代码

var a = 100;function fn(){    var a = 50;    console.log(a); //输出的是50}console.log(a); //输出的是100

函数作用域的意思就是某一个变量的只限定在特定函数体内,比如fn()这个函数体内。
全局作用域指的是,定义一个变量a,谁都能够访问到同名的变量a,最大的缺点就是,谁都能任意覆盖a的值。比如,在其它空白区域重新定义变量a,var a = 1000; 那么a就被覆盖成了1000。变量a数据容易被污染。


二、闭包

闭包的概念
一个函数能够访问其它函数内部的变量。举个例子:

function outer(){        var a = 100;        return function(){            return a;        }    }    var func = new outer();    func();//100

从上述代码可知,外部有一个函数outer(),outer()里有一个匿名函数,而匿名函数中却没有变量a,可是最后却能够成功打印变量a的值,所以这就是闭包。

原创粉丝点击