问一个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 个回答

    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 共同推出技术问答专区,为开发者们提供社区支持和帮助。在这里,你将直接获得...