javascript - 这里的this.name为什么是"Window"?
PHP中文网
PHP中文网 2017-04-10 15:43:11
0
11
1130
var name = "Window";
var oPerson = {
    name:"Bob",
    friend:{
      name:"Jonh",
      sayHi:function(){
        alert(this.name);
        }
    }
  };

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

认证0级讲师

全部回复(11)
小葫芦
var name = "Window";
function say(){
        alert(this.name);
        }

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

Ty80
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);
阿神

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

大家讲道理

这里

var sayHi = oPerson.friend.sayHi;

其实只赋值了函数式.

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

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

所以会得到"Window".

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

大家讲道理
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
小葫芦

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

黄舟

这时this指向的是全局对象

伊谢尔伦

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

伊谢尔伦

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

伊谢尔伦

http://segmentfault.com/a/1190000002640298

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!