# this的指向在函数创建的时候确定不了。只有在执行的时候,才可以确定。

## 1 、 这里的this指向window window.fn(); 所以this.user是undefined

function fn (){
  var user='追梦人';
  console.log(this.user); // undefined
  console.log(this); // window
}
fn();

## 2、谁调用,指向谁

 var o ={
user:'追梦人',
fn:function(){
console.log(this.user); // 谁调用,指向谁
}
}
o.fn();

## 3、

 var o ={
user:'追梦人',
fn:function(){
console.log(this.user); // 为什么不是undefiend,是window在调用
}
}
window.o.fn(); // 谁调用,指向谁

## 4、

 var o={
a:10,
b:{
a:12,
fn:function(){
console.log(this.a); //
},
},
}
o.b.fn();
  • - 如果函数中有this,但是他没被上一级的对象所跳用,这时this指向window
  • - 如果函数中有this,并且这个函数被上一级对象所调用,这时this指向上一级的对象
  • - 如果函数中有this,而且这个函数内部有多个对象,尽管这个函数被最外层所调用,
  • - 但是this的指向也只是他的上一级对象。
  • - 严格模式中,this不指向window,而是undefined

## 5、 注释掉a:12 this.a为 undefined

 var o={
a:10,
b:{
//a:12,
fn:function(){
console.log(this.a);
},
},
}
o.b.fn();
  • - 尽管对象b中,没有属性a,但是这个this也是指向对象b,因为this只会指向
  • - 它的上一级对象,不管该对象有没有a

## 6、this指向的永远都是最后调用它的对象(执行的时候,谁调用)

 var o={
a:10,
b:{
a:12,
fn:function(){
console.log(this.a); // undefined
console.log(this); // window
},
},
}
var fn=o.b.fn; // 注意:这里并没有执行
fn(); // 执行fn
  • - 注意:虽然,函数中的fn被对象b所引用,但是在赋值的时候,并没有执行,
  • - 所以最终的指向是window
  • - 上面的例子不同,因为上面的例子直接执行了fn()

## 7、构造函数中的this

 function Fn(){
this.user="追梦人";
}
var fn = new Fn();
console.log(fn.user);
  • - 之所以对象a可以用函数Fn中的uesr,是因为new关键字改变了this的指向。
  • - new 关键字创建了一个对象实例, 相当于复制了一份Fn到对象a中。
  • - 此时,只是创建,没有执行。
  • - 最后调用的是fn,那么this指向自然是fn
  • - 首先,new关键字会创建一个空对象
  • - 然后会自动调用一个函数的apply方法,将this指向这个空对象,这样函数内部的this就会被这个空对象所替代。
  • - bind apply(数组) call

## 8、构造函数 return 对象 的时候

 function Fn(){
this.user="追梦人";
return {} // 返回 一个对象
}
var fn = new Fn();
console.log(fn.user); // undefined
  • - 返回一个对象的时候,this会指向返回的对象

## 9、return 简单类型的数据

 function Fn(){
this.user="追梦人";
return 1; // 返回的是一个简单类型
}
var fn = new Fn();
console.log(fn.user); // 追梦人
  • - 返回简单类型数据,this还是指向函数的实例

## 10、return null的时候

 function Fn(){
this.user="追梦人";
return null; // 返回的是一个简单类型
}
var fn = new Fn();
console.log(fn.user); // 追梦人
  • - 注意:返回null虽然是个对象,this还是指向函数的实例,null特殊

javascript中,对于this指向的浅见的更多相关文章

  1. javascript中this的指向

    作为一个前端小白在开发中对于this的指向问题有时候总是会模糊,于是花时间研究了一番. 首先this是JS的关键字,this是js函数在运行是生成的一个内部对象,生成的这个this只能在函数内部使用. ...

  2. Javascript中的this指向。

    一.JavaScript中的函数 在了解this指向之前,要先弄明白函数执行时它的执行环境是如何创建的,这样可以更清楚的去理解JavaScript中的this指向. function fn(x,y,n ...

  3. JavaScript中 this 的指向

    很多人都会被JavaScript中this的指向(也就是函数在调用时的调用上下文)弄晕,这里做一下总结: 首先,顶层的this指向全局对象. 函数中的this按照调用方法的不同,其指向也不同: 1.函 ...

  4. 前端面试之JavaScript中this的指向【待完善!】

    JavaScript中this的指向问题! 另一个特殊的对象是 this,它在标准函数和箭头函数中有不同的行为. 在标准函数中, this 引用的是把函数当成方法调用的上下文对象,这时候通常称其为 t ...

  5. JavaScript中的this指向

    this是谁 技术一般水平有限,有什么错的地方,望大家指正. this代指当前对象super调用父类的构造函数,应表会运网数物,加载驱动建立链接执行SQL处理结果,直到现在每想起这三点就能想起我上大学 ...

  6. Javascript 中的this 指向的对象,你搞清楚了吗?

    Javascript 中的this 总让人感到困惑,你能分清以下三种test1(),test2(),test3() 情况下的输出吗? 注:以下Javascript运行环境中为浏览器 //1 this在 ...

  7. javascript中的this指向问题

    在深入学习JavaScript之后,我们越来越多的会遇到函数或者在对象内部中,对于this的指向问题的疑惑,其实基本上每一个编程语言中都有一个this,这个this的指向都是大同小异,你也可以汉化它的 ...

  8. 谈谈 JavaScript 中的 this 指向问题

    JavaScript 中的 this 为一个重难点,它不像静态语言 C#.Java 一样,就表示当前对象.而在 JS 中, this 是运行时确定,而并非定义时就已确定其值. 谈起 this ,必须少 ...

  9. JavaScript中this的指向问题

    this是面向对象语言中一个重要的关键字,理解并掌握该关键字的使用对于我们代码的健壮性及优美性至关重要.而javascript的this又有区别于Java.C#等纯面向对象的语言,这使得this更加扑 ...

  10. 轻松几句搞定【Javascript中的this指向】问题

    this关键字在JavaScript中扮演了至关重要的角色,每次它的出现都伴随着它的指向问题,这也是很多初学者容易出错的地方. 不过,这篇文章将会带你一次性搞定this指向的问题,望能给大家提供帮助! ...

随机推荐

  1. 从C#到Objective-C,循序渐进学习苹果开发(4)--代码块(block)和错误异常处理的理解

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本文继续上一篇随笔<从 ...

  2. Windows Server 2008 R2 负载平衡入门篇

    一.简单介绍负载均衡 负载均衡也称负载共享,它是指负载均衡是指通过对系统负载情况进行动态调整,把负荷分摊到多个操作节点上执行,以减少系统中因各个节点负载不均衡所造成的影响,从而提高系统的工作效率.在常 ...

  3. jquery可见性选择器(综合)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 【Java每日一题】20161111

    package Nov2016; import java.io.Serializable; public class Ques1111 implements Serializable{ private ...

  5. springmvc(3)拦截器HandlerInterceptor源码的简单解析

    其实拦截器就是我们的AOP编程.拦截器在我们的实际项目中实用性比较大的,比如:日志记录,权限过滤,身份验证,性能监控等等.下面就简单的来研究一下拦截器: public interface Handle ...

  6. Windows Git中文文件名乱码

    在Windows下使用git,安装包如下: https://git-for-windows.github.io/ 在使用git bash时git 默认中文文件名是 xx% 是因为 对0x80以上的字符 ...

  7. Verilog学习笔记设计和验证篇(五)...............层次化事件队列

    详细的了解层次化事件队列有助于理解Verilog的阻塞赋值和非阻塞赋值功能.所谓层次化事件队列指的是用于调度仿真时间的不同Verilog事件队列.在IEEE的5.3节中定义了层次化事件队列在逻辑上分为 ...

  8. JVM调优总结:调优方法

    JVM调优总结:调优方法 2012-01-10 14:35 和你在一起 和你在一起的博客 字号:T | T 下面文章将讲解JVM的调优工具以及如何去调优等等问题,还有一些异常问题的处理.详细请看下文. ...

  9. Java接口之间的继承

    /** * Created by xfyou on 2016/11/3. * 多接口之间的继承 */ public class HorrorShow { static void u(Monster b ...

  10. Android应用开发基础之十一:新特性

    Fragment 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容 生命周期方法跟Activity一致,可以理解把其为就是一个Activity 定义布局文件作为Fra ...