ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

js经典面试题之getName

2021-10-14 11:01:57  阅读:154  来源: 互联网

标签:function 面试题 函数 getName js alert new Foo


此题涉及的知识点:声明提升和提升优先级、构造函数返回值问题、js运算符优先级、实例化对象的属性访问优先级、逻辑运算符运算

var Foo = function(){
getName = function(){alert(1)};
return this;
}
Foo.getName = function(){alert(2)};
Foo.prototype.getName = function(){alert(3)};
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

(2) 第二个getName();直接调用getName函数一个是函数表达式,一个是函数声明,由于var存在变量提升并且函数声明也会提前
所以7-10行相当于
var getName;
function getName(){}
getName = function(){};

故函数声明覆盖了getName();但后面的getName又覆盖了函数声明
(3)先执行Foo函数,然后调用Foo函数的返回值this指向全局变量,覆盖刚刚的alert(4)
故现在getName的值为alert(1) ,(4)如上所示
(5)new Foo.getName()考察js的运算符优先级问题
new (Foo.getName) ();
实际上是调用Foo构造函数的getName函数
(6)new Foo().getName()
相当于(new Foo()).getName()实例化Foo,this指向本身,本身构造函数没有getName属性,去找原型对象中的getName
(7)new new Foo().getName()相当于new ((new Foo()).getName)();
先初始化Foo的实例化对象,然后将其原型上的getName函数作为构造函数再次new

标签:function,面试题,函数,getName,js,alert,new,Foo
来源: https://blog.csdn.net/weixin_43881014/article/details/120759828

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有