Js综合面试题-01

考点:

1、变量提升和函数提升

2、this指向

3、变量查找规则及作用域

4、运算符优先级

5、实例对象查找属性(隐式原型链)

例题:

原:

  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)
  }

1、遇到function关键字会将代码整体提升 (函数提升)

2、遇到var关键字声明的变量,会将变量提升,变量值不动 (变量提升)

3、若两者冲突,则只会保留函数的定义

提升后:

  function  Foo() {
     
    getName=function () {
          //由于此函数作用域中未声明变量getName,所以去全局作用域中找,所以将下面的getName重赋值
      alert(1);
      return this;
    }
  }
  //var getName;   和function getName()冲突,省略

/*
    function getName() {
      alert(5)                       //下面已经重赋值,可注掉
    }
*/

  Foo.getName=function () {
     
    alert(2)
  };
  Foo.prototype.getName=function () {
     
    alert(3)
  };
   /*  getName=function () {   //重赋值,上面的function getName注释掉
    alert(4)
  };*/    
  getName=function(){
          
    alert(1)
  };

输出:

Foo.getName();  //  2

getName();  //   4

Foo().getName();   // (Foo()).getName()   以函数的形式调用,this指向window, 即 window.getName()   // 1

getName();  // 1

new Foo.getName();  // new (Foo.getName)() -->new ( function(){alert(2)} )()   new会生成一个实例对象,此处并未使用  //2

new Foo().getName(); // (new Foo()).getName() -->foo.getName()  new Foo()生成一个实例对象foo,foo的构造函数是Foo,
					 //foo自身没有getName(),所以会去构造函数中寻找,但是构造函数也没有,就会去构造函数原型寻找  // 3

new new Foo().getName();  //new ((new Foo()).getName)() -->new ( function(){alert(3)} ) ()    // 3

总结: 1、 . 的优先级最高,先执行,若前面为()如 new Foo() ,则会将前面的先进行运算

2、 new ( function(){alert(2)} )() 执行内部的函数,输出2,并生成一个实例对象

你可能感兴趣的:(学习中的小问题)