问一个javascript基础问题

function f() {
    this.f1 = function () {
        console.log('hello world');
    }
}

var ff = new f
ff.f1()// 成功输出hello world

f.f1()//报错 f1 is not a function

为何直接调用不行而必须要实例化后才能去调用呢?

阅读 111
评论
    2 个回答
    • 1.1k

    因为你实例化了,有执行到this.f1 = function(){},你f.f1(),又没执行到函数体,上面的函数只是声明了,并没执行。

      Q1:为什么报错?
      因为f和它的原型链上都没有f1这个函数,所以f.f1是undefined,f.f1()必须报错:
      Uncaught TypeError: f.f1 is not a function
      Q2:为什么要实例化才能调用?
      因为你实例化一个对象后,相当于给这个对象添加了一个属性f1,对象访问自身属性肯定是没问题的(暂不考虑Symbol定义的对象属性)


      从代码之外的角度来理解:
      f是构造函数,类似于建筑蓝图,记载了某个建筑的详细信息,比如有几个门,窗户在哪里。
      new f()调用构造函数创造实例,类似于根据建筑蓝图造了个建筑。
      门,窗户都是实际建筑才有的属性,蓝图只是张纸不是个实际建筑你去访问他的门当然访问不到了
      (引自:https://www.zhihu.com/question/51820518)


      如果你要访问函数内部变量,可用闭包:

      function f() {
          return function () {
              console.log('hello world');
          }
      }
      f()() // hello world
        撰写回答

        登录后参与交流、获取后续更新提醒

        七牛云问答
        合作问答

        七牛云 联合 SegmentFault 共同推出技术问答专区,为开发者们提供社区支持和帮助。在这里,你将直接获得...