function fn() {
rank = function() {
alert("盖伦")
}
console.log(this);
return this;
};
fn.rank = function() {alert("赵信")};
fn.prototype.rank = function() {alert("典韦")};
var rank = function() {alert("项羽")};
function rank() {alert('琴女')};
fn.rank();
rank();
fn().rank();
rank();
new fn.rank();
new fn().rank();
new new fn().rank();
解析:
/*
预编译:
var rank;
function fn() {rank = function() {alert("盖伦")}console.log(this);return this};
function rank() {alert('琴女')};
fn.rank = function() {alert("赵信")};
fn.prototype.rank = function() {alert("典韦")};
rank = function() {alert("项羽")};
rank = function() {alert("盖伦")}
rank = function() {alert("盖伦")}
rank = function() {alert("盖伦")}
fn.rank();//弹窗赵信
rank();弹窗项羽
fn().rank();//先运行fn()
fn()预编译:修改外部rank变量 rank = function() {alert("盖伦")} this是window对象
返回window对象,再运行window.rank()
弹窗盖伦
rank();//弹窗盖伦
new (fn.rank)();new 函数 () new带参>new 函数 new无参和函数调用
创建空对象,运行fn.rank函数
弹窗赵信
(new fn()).rank();
创建空对象,运行fn函数,又再次修改外部的rank变量 rank = function() {alert("盖伦")}
this指向创建的空对象,打印创建的空对象,返回创建的空对象。执行{}.rank()
空对象中没有rank函数,就找到原型对象的fn.prototype.rank = function() {alert("典韦")};
弹窗典韦
new new fn().rank();==>(new (new fn()).rank());
先(new fn()) 先创建空对象再运行fn函数,又再次修改外部的rank变量 rank = function() {alert("盖伦")}
this指向创建的空对象,打印创建的空对象,返回创建的空对象。
{}.rank是原型对象的fn.prototype.rank = function() {alert("典韦")};
再用原型对象上的rank函数new 带参
先创建一个空对象,再运行fn.prototype.rank = function() {alert("典韦")};函数
弹窗典韦
*/