一个经典的预解析和作用域的面试题
2019-03-05 18:36
106 查看
function Foo() {
getName = function () {
console.log(‘1’);
};
return this;
}
Foo.getName = function () {
console.log(‘2’);
}; Foo.prototype.getName = function () { console.log('3'); }; var getName = function () { console.log('4'); }; function getName() { console.log('5'); } 请写出以下输出结果: Foo.getName(); getName(); Foo().getName(); getName(); new Foo.getName(); new Foo().getName(); new new Foo().getName(); function Foo() { getName = function () { console.log('1'); }; return this; } Foo.getName = function () { console.log('2'); }; Foo.prototype.getName = function () { console.log('3'); }; var getName = function () { console.log('4'); }; function getName() { console.log('5'); } /// 1. ------------------------------------------------------------ // Foo.getName();运行时题目与解析为下: 故 打印 2 function Foo() { getName = function () { console.log('1'); }; return this; } // var getName;//变量提升 值不提升 但是和第五个函数同名 被覆盖 function getName() { //打印5的函数虽然被提升了 但是此时它相当于一个全局变量 而打印4的 getName函数将给打印5的getName函数重新赋值变成 console.log('4'); // 相当于(var a = 5, a = 4 可以这样理解) } Foo.getName = function () { console.log('2'); }; Foo.prototype.getName = function () { console.log('3'); }; // 2. ---------------------------------------- // Foo.getName(); // getName();运行到这个时 直接打印 4 //3 . ---------------------------------------- // Foo().getName(); 运行到这一行时 上面的函数会被解析成下: function Foo() { getName = function () { //此时打印1 的函数相当于隐式全局变量 给打印4 的函数从新赋值 变成现在这样 console.log('1'); }; return this; } function getName() { console.log('1'); } Foo.getName = function () { console.log('2'); }; Foo.prototype.getName = function () { console.log('3'); }; // Foo.getName(); // getName(); // Foo().getName(); 打印 1 // 4. ---------------------------------------- // Foo.getName(); // getName(); // Foo().getName(); // getName(); //运行到这一行直接打印 1 // 5. ---------------------------------------- // Foo.getName(); // getName(); // Foo().getName(); // getName(); // new Foo.getName(); //简单而言, . 的优先级高于 new ,所以第五问可以看成 new (Foo.getName)(); ,故结果为 2。 // 6. ---------------------------------------- // Foo.getName(); // getName(); // Foo().getName(); // getName(); // new Foo.getName(); // new Foo().getName(); // 可以看成 (new Foo()).getName() (也就是实例对象 可以访问 这个构造函数的prototype属性的任意成员) 故打印 3 // 7. ---------------------------------------- // Foo.getName(); // getName(); // Foo().getName(); // getName(); // new Foo.getName(); // new Foo().getName(); // new new Foo().getName(); // 可以看成 new ((new Foo()).getName)(); 打印 3
相关文章推荐
- 【单链表经典面试题解析三】在无头单链表的一个非头节点前插入一个节点(要求不能遍历单链表)
- 算法之乐:一个算法解决3道经典二叉树面试题(深度、长度、直径)
- 100+经典Java面试题及答案解析
- 多线程:自动释放池(含一个经典面试题)
- 多态经典面试题解析
- Oracle删除一个表中的重复记录(一道经典的面试题)
- 100多道经典的JAVA面试题及答案解析
- 免费视频教程分享 :java经典面试题深度解析
- 小博老师解析Java经典面试题 ——常见Http状态号
- (C语言)关于位段空间的使用情况的经典面试题解析
- 小博老师解析经典Java面试题-&与&&运算符
- [经典面试题]给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数
- 免费视频教程:java经典面试题深度解析
- 一个非常经典的经理人面试题
- 【一个经典的google面试题】在浏览器中输入Google.com并且按下回车之后发生了什么?
- 一个经典的面试题
- C++经典面试题解析
- Java面试题多思路解析--有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中
- 【一个经典的google面试题】在浏览器中输入Google.com并且按下回车之后发生了什么?
- 关于js原型的经典面试题解析