阿里经典面试题
阿里的一道经典的考察原型、函数声明提前、运算符优先级等知识点的题目,分享给童鞋们,可以先不看答案,题尾附答案及解析。
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();
Foo.getName(); //=>[对象] 2
getName(); //=>[全局] 4
Foo().getName(); //=>[先把FOO作为普通函数执行,在处理GET-NAME] 返回的是WIN,WIN.GET-NAME() =>1
getName(); //=>[全局] 1
new Foo.getName(); //=>成员访问的优先级高于无参数列表NEW =>Foo.getName ([F->2]) =>new [F->2]() 用构造函数的方式把找到的函数执行,创建这个函数类的一个实例(构造函数执行也是先像普通函数执行一样执行) =>2
new Foo().getName();//=>成员访问和有参数列表NEW优先级都是19,按照从左到右依次执行即可 =>new Foo() =>创造Foo的一个实例(f) =>f.getName() =>3
new new Foo().getName();//=>先算new Foo(),创造一个实例(f) =>new f.getName() =>继续执行优先级高的成员访问 =>f.getName =>[F->3] =>new [F->3]() =>构造函数执行这个方法 =>3
/*
* Foo.getName 点是成员访问符
* new Foo; 无参数列表NEW
* new Foo(); 有参数列表NEW
*/
再附一张运算符优先级图片,共勉。