美文网首页
JavaScript 11

JavaScript 11

作者: 依依玖玥 | 来源:发表于2017-06-19 23:56 被阅读0次

    作用域

    任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。

    全局作用域(Global Scope)

    在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域:

    (1)在最外层函数外面定义的变量拥有全局作用域

    var authorName="山边小溪";

    function doSomething(){

    var blogName="梦想天空";

    function innerSay(){

    alert(blogName);

    }

    innerSay();

    }

    alert(authorName);

    alert(blogName);

    doSomething();

    innerSay() ;

    (2)所有末定义直接赋值的变量自动声明为拥有全局作用域,

    function doSomething(){

    var authorName="山边小溪";

    blogName="梦想天空";

    alert(authorName);

    }

    doSomething();

    alert(blogName);

    alert(authorName);

    变量blogName拥有全局作用域,而authorName在函数外部无法访问到

    (3)所有window对象的属性拥有全局作用域

    一般情况下,window对象的内置属性都拥有全局作用域,例如window.name、window.location、window.top等等。

    局部作用域(Local Scope)

    和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域称为函数作用域,例如下列代码中的blogName和函数innerSay都只拥有局部作用域

    function doSomething(){

    var blogName="梦想天空";

    function innerSay(){

    alert(blogName);

    }

    innerSay();

    }

    alert(blogName); //脚本错误

    innerSay(); //脚本错误

    作用域链(Scope Chain)

    由于js的变量都是对象的属性,而该对象可能又是其它对象的属性,而所有的对象都是window对象的属性,所以这些对象的关系可以看作是一条链 ,链头就是变量所处的对象,链尾就是window对象

    var n=1;

    function show(){

    var n=2;

    alert(n);

    }

    show();

    当函数show执行的时候,首先在函数show内部查找变量n,没有找到,再向外层查找,找到了全局变量n,alert显示结果为1。

    原理就是JavaScript作用域是层层包含的,外层的作用域在内层有效,执行的时候,从内层向外层查找

    局部变量优先级高于全局变量

    var n=1;

    function show(){

    var m=2;

    var n=3;

    alert(n);  //显示结果为3

    }

    show();

    根据上面变量作用域链的原理,函数执行时,会先从内层向外层查找,如果在内层中找到变量,查找就会停止。所以内层的作用域会优先于外层,局部优先于全局。

    var n=1;

    function show(){

    var m=2;

    var n=3;

    alert(window.n);  //显示结果为1

    }

    show();

    为什么会是1,而不是3呢,只是另外一个问题:全局变量都是window对象的属性,任何的全局变量都是window对象的属性,都可以用window.*来引用。(*代表一个变量)

    函数内部的var声明的变量作用域

    在函数内部使用var声明的变量,不论在何处声明,该变量都拥有整个函数的作用域。

    var n=1;

    function show(){

    alert(n);  //undefined

    alert(this.n); //显示为1

    var n=3;  //声明局部变量n

    alert(n);  //显示为3

    }

    show();

    第一个问什么会显示undefined呢,这个问题的原因就是在函数后面声明了局部变量n=3,在函数show执行的时候,会先从内层查找变量n,结果找到了,但在第一个alert的时候,n还没有赋值,故结果为undefined。

    每天的沉淀都是为了有更好的明天,上天不会辜负每个努力的人,只要你坚持下去,相信自己,为自己加油!!!

    相关文章

      网友评论

          本文标题:JavaScript 11

          本文链接:https://www.haomeiwen.com/subject/ebonqxtx.html