首页  >  问答  >  正文

javascript - 这里的this.name为什么是"Window"?

var name = "Window";
var oPerson = {
    name:"Bob",
    friend:{
      name:"Jonh",
      sayHi:function(){
        alert(this.name);
        }
    }
  };

var sayHi = oPerson.friend.sayHi;
sayHi(); //"Window"
PHP中文网PHP中文网2750 天前1139

全部回复(11)我来回复

  • 高洛峰

    高洛峰2017-04-10 15:45:11

    var name = "Window";
    function say(){
            alert(this.name);
            }

    道理和上面一样, 你的 function this 并没有特殊指向, 所以默认指向了 window.

    回复
    0
  • PHP中文网

    PHP中文网2017-04-10 15:45:11

    var name = "Window";
    var oPerson = {
        name:"Bob",
        friend:{
          name:"Jonh",
          sayHi:function(){
            alert(this.name);
            }
        }
      };
    
    var sayHi = oPerson.friend.sayHi.call(oPerson);
    var sayHi = oPerson.friend.sayHi.call(oPerson.friend);

    回复
    0
  • 阿神

    阿神2017-04-10 15:45:11

    这里跟调用位置有关系。
    第一如果是通过对象来调用。
    比如oPerson.friend.sayHi() 那么this就会指向 oPerson的作用域。
    第二如果赋值后调用
    var sayHi = oPerson.friend.sayHi;
    此时,sayHi变量直接引用sayHi函数体。调用sayHi()时,此处的作用域是windows.

    回复
    0
  • 大家讲道理

    大家讲道理2017-04-10 15:45:11

    这里

    var sayHi = oPerson.friend.sayHi;

    其实只赋值了函数式.

    整段js就相当于你只写了:

    var name = "Window";
    function(){
        alert(this.name);
    }

    所以会得到"Window".

    可以阅读一些js关于函数式编程的资料,你就明白了

    回复
    0
  • 大家讲道理

    大家讲道理2017-04-10 15:45:11

    var name = "Window";
    var oPerson = {
        name:"Bob",
        friend:{
          name:"Jonh",
          sayHi:function(){
            alert(this.name);
            }
        }
      };
    
    
    var sayHi = oPerson.friend.sayHi.call(oPerson.friend);//直接输出John
    var sayHi = oPerson.friend.sayHi.bind(oPerson.friend);
    sayHi();//Jonh

    回复
    0
  • 高洛峰

    高洛峰2017-04-10 15:45:11

    匿名函数的作用域是全局性的,因此闭包的this通常指向全局对象window

    回复
    0
  • 黄舟

    黄舟2017-04-10 15:45:11

    这时this指向的是全局对象

    回复
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 15:45:11

    问题的主要点就是匿名函数,在匿名函数中使用this通常都是指向包含它的上层作用域。记住这个以后遇到类似问题就很清楚了

    回复
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 15:45:11

    变量sayHi的指针指向的是sayHi方法,那么调用sayHi方法时,由于sayHi是全局变量且在浏览器执行,所以返回的是window.name = Window

    回复
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 15:45:11

    http://segmentfault.com/a/1190000002640298

    回复
    0
  • 取消回复