您的位置:首页 > 职场人生

一个经典的预解析和作用域的面试题

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: