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

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

阅读 1.9k
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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
七牛云问答
子站问答
访问
宣传栏