this是js的一个关键字,随着函数使用场合不同,this的值会发生变化。但是总有一个原则,那就是this指的是调用函数的那个对象。

情形1:如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window,这里需要说明的是在js的严格版中this指向的不是window。

情形2:如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。

情形3:如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象。

一些例子:

//this最终指向的是调用它的对象,这里的函数a实际是被Window对象所点出来的
<script>
function a(){
var user="Sherry";
console.log(this.user);//undefined
console.log(this); //Window
alert(this.user); //undefined
alert(this); //[object Window]
}
a();//写成Window.a() 也是一样的!
</script>
//this指向的是对象o,因为你调用这个fn是通过o.fn()执行的,那自然指向就是对象o
<script>
var o={
user:"Sherry",
fn:function() {
console.log(this.user);//Sherry
alert(this.user);//Sherry
alert(this); // [object Object]
}
}
o.fn();
</script>
<!--//window是js中的全局对象,我们创建的变量实际上是给window添加属性,所以这里可以用window点o对象。所以和上面一样-->
<script>
var o={
user:"Sherry",
fn:function() {
console.log(this.user);//Sherry
alert(this.user);//Sherry
alert(this); // [object Object]
}
}
window.o.fn();
</script>
var o = {
a:10,
b:{
a:12,
fn:function(){
console.log(this.a); //
}
}
}
o.b.fn();
//尽管对象b中没有属性a,这个this指向的也是对象b,因为this只会指向它的上一级对象,不管这个对象中有没有this要的东西。
var o = {
a:10,
b:{
// a:12,
fn:function(){
console.log(this.a); //undefined
}
}
}
o.b.fn();
var o = {
a:10,
b:{
a:12,
fn:function(){
console.log(this.a); //undefined
console.log(this); //window
}
}
}
var j=o.b.fn;
j();
   //构造函数版this:
function Fn(){
this.user = "Sherry";
}
var a = new Fn();
console.log(a.user); //Sherry
//这里之所以对象a可以点出函数Fn里面的user是因为new关键字可以改变this的指向,将这个this指向对象a,为什么说a是对象,因为用了new关键字就是创建一个对象实例,我们这里用变量a创建了一个Fn的实例(相当于复制了一份Fn到对象a里面),此时仅仅只是创建,并没有执行,而调用这个函数Fn的是对象a,那么this指向的自然是对象a,那么为什么对象Fn中会有user,因为你已经复制了一份Fn函数到对象a中,用了new关键字就等同于复制了一份
    function fn()
{
this.user = 'Sherry';
return {};
}
var a = new fn;
console.log(a.user); //undefined function fn()
{
this.user = 'Sherry';
return function(){};
}
var a = new fn;
console.log(a.user); //undefined function fn()
{
this.user = 'Sherry';
return 1;
}
var a = new fn;
console.log(a.user); //Sherry function fn()
{
this.user = 'Sherry';
return undefined;
}
var a = new fn;
console.log(a.user); //Sherry //以上:如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例。
    function fn()
{
this.user = 'Sherry';
return undefined;
}
var a = new fn;
console.log(a); //fn {user: "Sherry"} //虽然null也是对象,但是在这里this还是指向那个函数的实例,因为null比较特殊。
function fn()
{
this.user = 'Sherry';
return null;
}
var a = new fn;
console.log(a.user); //Sherry

注意点:

1.在严格版中的默认的this不再是window,而是undefined。

2.new操作符会改变函数this的指向问题,虽然我们上面讲解过了,但是并没有深入的讨论这个问题,网上也很少说,所以在这里有必要说一下。

    function fn(){
this.num = 1;
}
var a = new fn();
console.log(a.num); // //为什么this会指向a?首先new关键字会创建一个空的对象,然后会自动调用一个函数apply方法,将this指向这个空对象,这样的话函数内部的this就会被这个空的对象替代。

最新文章

  1. iOS黑客技术相关
  2. AngularJS cookie的使用
  3. Web API Test Client 1.2.0
  4. iOS基础 - UIScrollView
  5. java操作mongodb——查询数据
  6. tp框架
  7. 关于CSS各种选择器,还有各种引入样式表的区别,import导入样式表,在介绍一些伪类选择器
  8. 自适应滤波——线性预测(LPC)
  9. C++ sizeof 误区 大公司面试题
  10. matlab中 mcc、mbuild和mex命令详解
  11. form表单中button按钮返回上一页解决办法
  12. cvc-complex-type.2.4.a: Invalid content was found starting with element &#39;property&#39;. One of &#39;{&quot;http:// www.springframework.org/schema/beans&quot;:import, &quot;http:// www.springframework.org/schema/beans&quot;:a
  13. MacBookPro-OSX
  14. Spring Cloud 与 Dubbo、Spring Cloud 与 Docker、Spring Cloud 与 Kubernetes 比较
  15. 让你的Python代码更加pythonic
  16. @staticmethod和@classmethod的作用与区别
  17. Struts2拦截器的配置
  18. 关于MySQL在内网中使用另一台机器访问的问题
  19. Gson、FastJson、json-lib对比与实例
  20. git向github提交时不输入账号密码

热门文章

  1. Linux下分割、合并PDF(pdftk),用于Linux系统的6款最佳PDF页面裁剪工具
  2. 论文神器Latex30分钟快速入门教程-只需9步向学神看齐
  3. 23.读写锁ReadWriteLock
  4. css表格单元格中的长文本的显示问题
  5. IOS实现多媒体音频之音乐播放器
  6. Cognos利用DMR与文本对象设计中国式报表
  7. 【pyhon】理想论坛爬虫1.08
  8. 【Canvas】动态正17边光阑 向高斯致敬
  9. 高德地图引入库错误std::string::find_first_of(char const*, unsigned long, unsigned long) const&quot;
  10. Ubuntu apt-get方式安装Subversion