js函数篇面试题

原型链图解
原型链图解

  1. instanceof是如何判断的?
  • 表达式: A instanceof B
  • 如果B函数的显式原型对象在A对象的原型链上, 返回true, 否则返回false
  1. Function是通过new自己产生的实例

原型链

  console.log(Object instanceof Function)  //  true
  console.log(Object instanceof Object) // true
  console.log(Function instanceof Object) // true
  console.log(Function instanceof Function) // true
  function Foo() {}
  console.log(Object instanceof  Foo); // false
  
    /*
  测试题1
   */
  var A = function() {

  }
  console.log(A.prototype.n);
  A.prototype.n = 1
  console.log(A.prototype);

  var b = new A() // {n: 1}

  A.prototype = {
    n: 2,
    m: 3
  }

  var c = new A()
  console.log(b.n, b.m, c.n, c.m) // 1 undefined 2 3


  /*
   测试题2
   */
  var F = function(){}; // 函数对象
  Object.prototype.a = function(){
    console.log('a()')
  };
  Function.prototype.b = function(){
    console.log('b()')
  };
  var f = new F(); // 构造函数
  // f就是一个普通的实例对象
  f.a() // f的隐式原型对象 == F的显示原型对象 === {constructor}
  // f.b()
  F.a() // 函数对象, 当把函数当做对象看待的时候,这个时候其构造函数应该是Function
  F.b()

函数提升与变量提升

/*
   面试题: 输出什么?
   */
  var a = 4
  function fn () {
    console.log(a)  // undefined
    var a = 5
  }
  fn()


  /*变量提升*/
  console.log(a1) //undefined
  /*函数提升*/
  a2() //

  var a1 = 3
  function a2() {
    console.log('a2()') //a2()
  }

执行上下文

console.log('global begin: '+ i)
  var i = 1
  foo(1);
  function foo(i) {
    if (i == 4) {
      return;
    }
    console.log('foo() begin:' + i);
    foo(i + 1);
    console.log('foo() end:' + i);
  }
  console.log('global end: ' + i)    //1233211    5个执行上下文
console.log(b);
  if (!(b in window)) {
    var b = 1;
  }
  console.log(b) // undefined
var c = 1
  function c(c) {
    console.log(c) 
    var c = 3
  }
  console.log(c);
  c(2)   //c is not defined

作用域链

/*
   问题: 结果输出多少?
   */
  var x = 10;
  function fn() {
    console.log(x); //10
  }
  function show(f) {
    var x = 20;
    f();
  }
  show(fn);
console.log(fn); // undedined;
  var fn = function () { // fn = function
    console.log(fn)
  }
  fn()


  var obj = {
    fn2: function () {
      console.log(fn2) // 报错
    }
  }
  obj.fn2()
// 创建全局作用域 ---> 预解析工作 ---> 创建全局的执行上下文 ---> 执行上下文环境 ---> 全局变量对象{a: undefined, this: window, fun:function} ---> 作用域链[全局变量对象]
  var a = 123;
  var b = 'abc'
  // 先定义---> 创建局部作用域---> 函数自身有一个[[scopes]]: 上一级作用域链(global)
  function fun() {
    // 创建局部执行上下文 ---> 局部变量对象{a: undefined, fun2: function, this: window} ---> 创建作用域链[局部变量对象, Global]
    var a = 234;
    var c = 345;
    console.log(a);
    console.log(b);
    // fun2函数已经定义了 ---> 创建局部作用域(fun2)---> 函数自身有一个[[scopes]]: 上一级作用域链[fun的变量对象, Global]
    function fun2() {
      // 创建局部执行上下文 ---> 局部变量对象{this: window} ---> 创建作用域链: [fun2的局部变量对象,fun的变量对象, Global]
      console.log(c);
      console.log(d);
    }    
    fun2();
  }

  fun();

闭包:

//代码片段一
  var name = "The Window";
  var object = {
    name: "My Object",
    getNameFunc: function () {
      return function () {
        return this.name;
      };
    }
  };
    console.log(object.getNameFunc()());  //The Window


//代码片段二
  var name2 = "The Window";
  var object2 = {
    name2: "My Object",
    getNameFunc: function () {
      var that = this; // 缓存this
      return function () {
        return that.name2;
      };
    }
  };
  console.log(object2.getNameFunc()()); //My Object

/*
   说说它们的输出情况
   */

  function fun(n, o) {
    console.log(o);
    return {
      fun: function (m) {// 满足产生闭包的条件, 产生了一个闭包引用 ---> 外部函数fun的变量对象 === {n: 0, o:undefined }
        var num = 123;
        // var result = fun(m, n) = {}
        return fun(m, n);// m  = 1, n = 0
      }
    }
  }


  var b = fun(0).fun(1).fun(2).fun(3).fun(30).fun(55) //undefined,0,1,2, 3, 30

  var c = fun(0).fun(1) // {n: 1, o: 0}
  c.fun(2) // 1
  c.fun(3) //undefined,0,1,1

  var a = fun(0) // a = {fun: function(){}}
  a.fun(1) // m = 1 n = 0;
  a.fun(2)
  a.fun(3) //undefined,0 0 0
function Foo() {
    getName = function () { alert (1); };
    return this;
  }
  Foo.getName = function () { alert (2);};
  Foo.prototype.getName = function () { alert (3);};
  // getName = function(){ alert (5);}
  var getName = function () { alert (4);};
  function getName() { alert (5);}


  //请写出以下输出结果:
  Foo.getName(); // 2
  getName(); // 4
  Foo().getName(); // 1
  getName();// 1
  new Foo.getName(); // 2
  new Foo().getName(); // 3
  new new Foo().getName();// 3

对象

// 对象中所有的key都是字符串
  var a = {}
  var obj1 = {n:345345345} // toString() = '[object Object]'
  var obj2 = {hh: 4535345} // toString() = '[object Object]'
  a[obj1] = 4
  console.log(a); // {[object Object]: 4}
  a[obj2] = 5
  console.log(a[obj1]) // 输出多少?  5
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值