练习题

一、this和预解释

1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var num = 5;//6 7
var obj = {
num : 4, //5
fn : (function (num){
num++;
this.num++; //只执行函数的this是window
var num=2; // 3 4 不会有第二次声明
return function (){
num++;
this.num++;
console.log(num); //3 4
}
})()
};
var fn = obj.fn; // fn与obj.fn指向同一个函数,但是同一个函数中this会产生差异
fn(); //3 其中的this指的是 window
obj.fn(); //4 与fn指向同一个未被释放的栈内存,不同的只是this
console.log(this.num,obj.num); //7 5

  1. arguments[0] –> 理解为于arguments.0

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var len = 5;
    var fn = function(){
    console.log(this.len);
    console.log(this)
    };
    var main = {
    fn :function(fn){
    fn(); //fn是获取的就是全局fn函数。那么在这里执行fn函数中dethis是window,打印的就是window.len --》5
    arguments[0]();// arguments.0 ,这个函数里面的this是arguments -> undefined
    },
    len:10
    };
    main.fn(fn);
  2. 预解释 + 实例化 + js运算符优先级

    • js优先级汇总表
      -

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      function Foo() {
      getName = function () { alert (1); };
      return this;
      }
      Foo.getName = function () { alert (2);};
      Foo.prototype.getName = function () { alert (3);};
      var getName = function () { alert (4);};
      function getName() { alert (5);}
      //请写出以下输出结果:
      Foo.getName();
      getName();
      Foo().getName();
      getName();
      new Foo.getName();
      new Foo().getName();
      new new Foo().getName();
    • 答案详解

  3. 封装一个函数:把一个类数组转化成一个数组:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function toArray(a){
    try{
    //把slice中的this改为a,就变为了克隆a,并返回了;在ie8-都是不兼容的
    Array.prototype.slice.call(a);
    }catch(e){ //e是一个对象,e.message储存着try中的报错内容
    var ary = [];
    for(var i;i<a.length;i++){
    a[i]=ary[i];
    }
    return ary;
    }
    }