js-面试题 (盖伦、赵信、典韦、项羽、琴女')

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()   //典韦====>new((new fn()).rank)()

1)在全局作用域内声明一个函数类型的对象,函数名为fn,调用函数才会执行函数内部的代码。

function fn() {
  rank = function() {
    alert("盖伦")
  }
  console.log(this);
  return this
}

2)给对象fn添加一个属性即rank方法:function(){alert(“赵信”)},以后可以通过fn对象来调用这个rank方法。

fn.rank = function() {
  alert("赵信")
}

3)给对象fn的原型添加一个属性即rank方法:function(){alert(“典韦”)},以后用fn这个函数构造的对象就持有这个rank方法。

 

fn.prototype.rank = function() {
  alert("典韦")
}

4)在全局作用域内声明一个变量,变量名为rank,这个变量指向一个函数:function(){alert(“项羽”)},在这行代码以后的任意地方可以访问这个变量以及变量所指向的内容,在这行代码以前的任意地方可以使用这个变量的空间。

var rank = function() {

  alert("项羽")
}

5)在全局作用域内声明一个函数:function rank(){alert(“琴女”)},函数的名字为rank。以后可以在任意地方来调用这个函数。

function rank() {
  alert('琴女')
}

6fn.rank(),先执行成员访问,即fn对象调用rank方法,即fn.rank=function(){alert(“赵信”)},弹窗:赵信。

fn.rank()

7rank( ),函数的调用,根据变量提升,以及函数提升,函数的提升会在变量上面,在根据就近访问的原则,这里的rank指的是变量rank然后调用变量内的函数,即rank=function(){alert(“项羽”)},所以弹窗:项羽。

rank()

8fn().rank(),先执行成员访问,“.”左边先执行函数fn的调用。

        函数内部:(1rank=function(){alert(“盖伦”)},表示给变量rank赋值,这里的变量rank指的是外部声明的变量,由于这里是在使用变量rank的空间所以是可以取到这个空间的,即赋值成功,以后这个变量所指向的内容就是function(){alert(“盖伦”)}。(2return this,表示函数执行完毕,返回一个this关键字,this指向的谁掉用函数就指向谁,在这里调用函数的是window所以this指向的就是window,即返回window对象。函数fn的调用执行完毕,接着执行window.rank().

        同样的根据变量提升,以及函数提升,函数的提升会在变量上面,在根据就近访问的原则,这里的rank指的是变量rank然后调用变量内的函数,但是在函数fn调用的过程中变量rank被从新赋值了所以,这里的rank指向的就是function(){alert(“盖伦”)},即弹窗:盖伦。

fn().rank()

9rank( ),同第七条执行语句一样,变量已经被从新赋值了(function(){alert(“盖伦”)})所以弹窗:盖伦。
rank()

10new fn.rank(),先执行成员访问,即fn.rank,执行后就得到function(){alert(“赵信”)}

     然后执行new带参数,表示开辟一个新的空间,生成一个对象,然后再构造函数的调用,函数调用的结果就是弹窗:赵信。

new fn.rank()

11new fn().rank(),先执行成员访问,如果是fn().fank,就是先函数fn调用在掉rank方法,但是这样是调用不了的,所以是new fn()来调rank方法,即先new(创建)一个对象在调用fn( ),也就是利用函数fn的原型来创建一个对象,因为fn这个函数的原型有一个rank方法function(){alert(“典韦”)},所以成员访问的结果就得到一个方法,再调用这个方法,就会弹窗:典韦。
new fn().rank() 

12new new fn().rank(),同样的道理,先是执行成员访问得到一个方法,然后再执行new带参,即new(创建)一个对象,然后执行构造函数,执行构造函数就会出现弹窗:典韦。
new new fn().rank() 

你好!如果你有什么更好的建议或意见,请在评论区留言。感谢你的阅读!
原文地址:https://www.cnblogs.com/YCxiaoyang/p/7643052.html