预编译-this-new相关笔试题

110 阅读1分钟
        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("典韦")};函数
            弹窗典韦
        */

image.png