码迷,mamicode.com
首页 > Web开发 > 详细

基础知识回顾——js作用域

时间:2016-06-14 15:55:16      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:

1.对js作用域的理解。

  作用域

  作用域分为全局作用域和函数作用域,我们可以理解为变量的生存环境(空间)。全局作用域包含函数作用域,函数作用域里的变量可以访问到全局作用域中的变量,但是反之则不行。

  变量提升

  在js作用域中还有变量提升的现象(只有var 声明的变量才会有变量提升,window声明的不会),赋值语句最后生效。当我定义一个变量,如果它没有被赋值,它是属于undefined;

  变量提升的优先级

  函数声明 > 函数形参(函数的形参属于函数作用域;) > 自定义变量

  延长作用域,闭包(return function(){alert(...);})

  闭包核心思想:函数调用时,在该函数被声明的地方,通过作用域一层一层往外找;

  

1)

  window.a = 1;

  var a = 2; //全局作用域

  function test() {

    var a = 3; //函数作用域

    alert(a);

  }

  alert(a);

如上所示,alert(a)中的a变量寻找的顺序是 函数作用域—全局作用域,在test函数内部找到了,则弹出值为3;第二个alert,在全局作用域中寻找a,弹出值为2;

2)

  var a = 2;

  function test2() {

    //var a;

    alert(a);

    var a = 4;

  }

  对于test函数内部,存在声明的变量a,但是a的赋值操作在alert函数后面。则考虑在执行函数时,会在函数头部首先声明该函数内部使用到的所有变量,且不会被赋值。所以弹出值为undifined;

3)

  function test3(a) {

    //function a(){};  //同样提升到函数头部的变量,因为变量名相同,按照优先级的关系,alert的弹出值为函数a的函数体;

    //a = 7;

    //var a;

    alert(a);

    var a = 5;

    function a() {

    }

  }

  test3(7);

4)

  var obj = {

    name:‘aoao‘,

    getName:function() {

      alert(this.name);

    }

  }

  obj.getName(); //1

  var test5 = obj.getName;

  test5();//2

  注意比较标注1与标注2的区别;

  对于标注1:函数getName在obj内部声明,调用时this指向obj这个对象;

  对于标注2:函数getName的函数体赋值给了test5这个变量,相当于是:

   var test5 = function() {

     alert(this.name);

   }

  注意!此时函数声明在window对象下,this指向window对象;

5)(声明函数与函数表达式的区别)

  //function name() {alert(3);};

  name();

  function name() {alert(3);}

  与

  //var name;

  name2();

  var name2 = function() {alert(2);};

  声明函数会把整个函数声明放到头部,函数表达式会把其函数名的变量提升到头部,因此使用声明函数更加安全;

基础知识回顾——js作用域

标签:

原文地址:http://www.cnblogs.com/foxNike/p/5583180.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!