老师 承接上个问题钻个牛角尖 链接在下面

老师 承接上个问题钻个牛角尖 链接在下面

https://class.imooc.com/course/qadetail/245115

function w() {

this.name = document.getElementById("a");

this.age = this.name.querySelector("#age");

this.y = w;

}

var a = new w();

console.log(a.name);

console.log(a.age);

console.log(a.y)

按照老师上个问题的回答:在对象中不可以用对象名来调用 在对象中输出的也是underfined

我举了上面这个例子  函数也是对象  那我在函数体引用函数名或者通过函数名来调用也没有报错

下面截图是输出结果

麻烦老师详细的解释一下  

http://img1.sycdn.imooc.com//climg/5f27bd9c09b0779517000409.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学你好,虽然二者都是对象,但还是有一些区别的。

function(){}称为函数对象,{}称为普通对象。

在函数对象内部访问函数的时候,实际是在函数在调用时执行,此时函数已经声明完毕了。

而普通对象,如下:

http://img1.sycdn.imooc.com//climg/5f27e3170949902503590098.jpg

红框处,还没有声明好obj对象就访问了,因此访问到的是undefined。

如果我的回答帮到了你,欢迎采纳,祝学习愉快~

  • 大白前端 提问者 #1
    老师的意思就是说:像下面这段代码,调用obj.getName方法后能够输出obj.name的值是因为 此时obj已经声明完了,而直接在obj对象中把obj对象赋值给obj对象中的一个属性则输出underfined,是因为此时obj对象还没有声明完毕,请问是这样吗? var obj = { name:'eve', getName:function () { return this.name; } };
    2020-08-03 18:46:41
好帮手慕码 2020-08-04 09:34:20

同学你好,是这个意思。祝学习愉快~

  • 提问者 大白前端 #1
    谢谢老师!
    2020-08-04 09:44:06
好帮手慕码 2020-08-03 19:14:25

同学你好,有一些歧义,如下写法是可以访问name属性的:

http://img1.sycdn.imooc.com//climg/5f27eea309854b6b07580136.jpg

与之前的例子类似,改写为如下:

http://img1.sycdn.imooc.com//climg/5f27eece095ceb4d07860158.jpg

也是可以访问的。因为这么写和之前的函数对象一样,调用时候执行,这时候函数已经声明完毕了。

在普通对象中,直接在obj对象中把obj对象赋值给obj对象中的一个属性则输出underfined,是因为此时obj对象还没有声明完毕。

祝学习愉快~

  • 提问者 大白前端 #1
    其实老师想表达的是:在obj普通对象中的getName函数只有被调用才会执行函数体内的代码,而函数体内中的this其实指向的是obj对象,无论是函数体内的是输出obj对象(console.log(this))也好或者返回obj对象(return obj)也好,当在全局作用域下调用obj中的getName函数时,不会返回underfined,而会返回obj对象,因为obj对象已经声明完了。 而如果直接把obj对象赋值给obj对象中的一个属性(name:obj),在全局作用域打印输出obj.name则会输出underfined,因为此时obj对象还没声明完就赋值给name,所以name是underfined 老师对吗?
    2020-08-03 19:58:39
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师