学习JS(5)

来源:互联网 发布:java 角色权限管理 编辑:程序博客网 时间:2024/05/21 00:47

1.作用域

    1)在JS中,嵌套函数时非常普遍的,在函数嵌套中,首先在函数内寻找变量,如果查找不到,在逐层向外查找,直到全局区域,最后undefined;

    2)var是在函数运行的上下文中,声明一个变量,如果不加的话,则仅仅是一个复制操作;

    3)如果对于没有生命var的变量,在任何地方都找不到,就赋给window全局;

    4)以windows来引用全局变量,查找不到,返回undefined,作为不是全局变量的则是返回变量 is not defined。

 

2.词法分析

    1)分析参数;

    2)分析变量声明;

    3)分析函数声明。

    函数运行前进行分析参数,生成活动对象,把函数声明的参数,形成活动对象的属性,值都是undefined,接收实参形成活动对象相应属性的值,再分析变量的声明(var),如果活动对象上面已经有参数的属性,则没有影响,如果没有的话,则添加活动对象属性的值为undefined,最后分析函数声明,把函数赋给活动对象的对象的属性,如果之前对象的属性已经存在,则被覆盖。

    注:作用域链指作用域,原型链指活动对象,分析和执行时不同的过程,分析由外而内,执行由内而外。

 

3.arguments详解

    1)arguments是一个长的很像数组的对象,它的内容是函数运行时的实参列表。

    2)arguments可以存储所有的实参,即使没有与之对应的形参。

    3)形参与对应的arguments单元,其实是相互映射的,可以互相影响。

    4)索引也和数组一样是从0向后排序的。

    5)arguments想要获取函数运行是实参的个数,可以使用arguments.length。

    6)callee代表当前所运行的函数,可以用于匿名函数,形成对函数的调用。

    注:1)本函数活动对象上面没有某个属性,则继续去外层函数的活动对象上面查找,直到查找到全局变量,叫做作用域链;

            2)每个函数有自己的arguments.callee,但不向外层接着找arguments的相关属性,所以不形成链;

 

4.js中的this

    因为在实例化对象时,总是不能确定开发者会使用什么样的变量名。使用 this,即可在任何多个地方重用同一个函数。

    1)当this作为普通函数调用时,this的值指向window;

  示例1:  var x = 1;                                function test()  {      alert(this.x);    }   test(); // 1    示例2:  var x = 1;  function test()  {    this.x = 0;   }  test();  alert(x); //0 

    2)当this作为对象的方法来调用时,this指向方法的调用者,即这个对象;

  function test()  {     alert(this.x);   }    var obj = {};   obj.x = 1;   obj.m = test;   obj.m(); // 1  

    3)当this作为方法调用时,this指向其调用者,即它本来的对象;

    例如:a.obj = func; a.obj()就是调用func()。

    4)当this作为构造函数调用时,js中没有类的概念,创建对象是用构造函数来完成,或者直接用json格式{}来写对象。

  示例1:  function test()  {       this.x = 1;   }   var obj = new test();   alert(obj.x); // 1     示例2:  var x = 2;   function test()  {     this.x = 1;   }   var obj = new test();   alert(x); //2 


    5)apply调用

    this指向apply的第一个参数。

  示例:  var x = 0;  function test() 
  {      alert(this.x);  }  var obj = {};  obj.x = 1;  obj.m = test;  obj.m.apply(); //0  obj.m.apply(obj);//1
 

    注:函数.call(对象,参数……),函数的this指向对象。

 

0 0
原创粉丝点击