关于一个面试题

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构造函数
//var getname:全局定义一个变量叫getname
//function getname(){ 5 }  定义一个全局变量叫getname 为5号函数
//预解析结束的时候 getname是一个五号函数

//    执行  第一部分
//  1  foo.getname=function(){ 2 }    
//    =>把foo当做对象 里面添加了一个二号函数 
//    =>不是给foo的实例使用的 要是给实例使用 应该加在prototype上(给实例使用应该调用的是3号函数)
//    =>是给foo使用的 需要写foo.getname()
//  2  foo.prototype.getname=function(){3}
//    =>向foo的原型上添加一个3号函数
//    =>将来给foo的实例使用的  怎么调用呢  foo的实例.getname(),foo.prototype.getname()
//  3  getname=function(){4}
//    =>给全局变量getname进行赋值
//    =>全局变量getname本身存储的是5号函数 现在给他赋值为四号函数,5号函数被覆盖
//    =>从现在开始再也没有5号函数了
//    =>现在开始 全局getname是4号函数

//    第二部分   代码执行
//    foo.getname()
//      => 把foo当做一个对象,调用他身上的getname的成员
//      => foo自己身上的getname成员存储的是2号函数
//      => 结果是2
//    getname()
//      => 调用全局getname函数
//      => 全局getname函数在第一部分执行的时候 已经变成了四号函数
//      => 4
//    foo().getname() 
//      => 先把foo执行一遍 然后用返回值调用getname
//      =>1 执行foo
//         =>先给getname赋值 但是自己作用域没有getname去上一级作用域查找
//         =>给全局的getname赋值为1号函数
//         =>全局的四号函数被覆盖了
//         =>从此以后getname就是1号函数了
//         =>return this  (window)  这样的话foo().getname()就是windown.getname()
//      =>2 使用返回值调用getname()
//         =>window.getname()   输出1
//    getname()
//      =>又一次调入全局的getname函数    1
//    new foo.getname()
//      => new的是把foo当做对象的时候里面的那个函数
//      => 找到foo.getname函数 实例化一下
//      => new的过程就是把函数执行一遍
//      => 这里foo.getname函数执行了一遍
//      => 打印出来是2
//    new foo().getname()
//      => 先new foo函数 用实例对象调用getname函数
//      => 先执行一遍foo 又一次把全局getname覆盖了
//      => return this foo因为和new连用 ,本身this就是实例
//      => 实例调用getname()
//      => 实例自己身上没有 执行的是_proto_上面的getname
//      => 实际上是foo.prototype上面的getname函数     结果:3
// 
// 


本来怎么想都想不通为什么foo().getname()为什么是1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到haha里面没有a属性

猜你喜欢

转载自blog.csdn.net/xiaozhazhazhazha/article/details/112372906