1.作用域链

  作用域:浏览器给js一个生存环境(栈)内存

  作用域链:js中的关键字var function 都可以提前声明和定义,提前声明和定义,放在我们的内存地址(堆)内存中,然后js从上到下逐行执行,遇到变量就去内存地址查找是否存在这个变量有就直接使用,没有就继续向父级查找,直到window下结束,这种查找机制叫作用域链

  this的目的:js代码中存在大量的变量和函数,我们在只用他们的时候他们到底归属谁

  this               ( this是js的关键字,指定一个对象,然后去代替他)

  1.this分为函数内的this,函数外的this

  函数内的this,指向行为发生的主体(方法)

  函数外的this,都指向window   (没有意思)

  2.函数的this和函数在什么环境下定义的没有关系,而和自己的主体有关

  3.主体怎么找?    就看这个函数带没带"."  如果函数和方法执行带".",那么this指向"."前面的对象,如果不带点,this就指向window

  4.自执行函数里面的this都指向window

    小技巧:this个变量的面试题,先找到this的主体是谁,然后把它们换成那个主体就行了

  5.给元素中的某一个事件的绑定方法,

    当事件触发时,就执行绑定的方法,方法中的this指向当前元素;

  

  总结:怎样找到this的指函数内

  函数内的this跟函数在哪定义没有关系,只跟在执行时的主体有关,带点的主体就是"."前面的,不带"."就是window

  案例分析:

  1.

    var a={
    chifan:function(){
      console.log(this);
      }
    }
    a.chifan()             ( 这里面的this  a就是主体,因为他在"."前面)

  function chifan{

      console.log(this)

    }

  chifan()                                    (这个里面没带点,所以指向this指向window)

  2.var num=45;

  var obj={

    num=12,

    ff:(function(){

      console.log(this.num)

      })()                                            其结果为45;       (因为他是自调用,所以它的this指向window)

  var um=45;
  var obj={
    um:12,
    ff:function(){
      console.log(this.um)
      }
    }
  obj.ff()                                                  其结果为12;     ("." 因为有点,所以this指向它点前面就是他的对象) 

  3.  body中输入

  <div  id="div1"> hello world</div>

  function fn(){
    console.log(this)                             (其this指向的对象是div1    后面跟的语句为document.getElementById("div1").onclick=fn;        他的前面有".")
  } 
  document.getElementById("div1").onclick=function(){
    console.log(this);                           (其this指向的对象是div1    因为"."在他的前面)
  fn()                      (其this的指向的对象是window,因为没"."   )
  }
  document.getElementById("div1").onclick=fn;

  4.奇虎360的一道经典面试题

  

 1) var val=1;
  var obj={
    val:2,
    del:function(){
      console.log(this);                    this指的是对象obj
      this.val*=2
      console.log(val)                      (因为没有this,所以是一道作用域的题,内部没有声明val这个变量,所以去父级找,结果是1)
      console.log(this.val)    (有this,因为"." 所以他的对象是obj ,  obj中val的值为2,所以其结果是4)
    }
  }
  var ff=obj.del()

  

 2) var val=1;
  var obj={
    val:2,
    del:function(){
      console.log(this);              this指定的window;
      this.val*=5                         window的val被赋值为5*1(1是val全局的值)   最后的结果是val被赋值了5
      console.log(val)                (全局下的val)     所以结果是5
      console.log(this.val)          (全局下的val)    所以结果是5
     }
   }
  var fn=obj.del;

  fn()

  

  最后说一下var ff=obj.del()与var fn=obj.des;fn()的区别

  var ff=obj.del()     说的是声明一个变量 将obj为对象的del()函数赋值给ff;

  var fn=obj.del;fn()     说的是声明一个变量将obj为对象的del以匿名函数赋值给fn,   因为没"." 所以fn()是在window下的

javascript中有关this的解析题的更多相关文章

  1. JavaScript中依赖注入详细解析

    计算机编程的世界其实就是一个将简单的部分不断抽象,并将这些抽象组织起来的过程.JavaScript也不例外,在我们使用JavaScript编写应用时,我们是不是都会使用到别人编写的代码,例如一些著名的 ...

  2. javascript中 json数据的解析与序列化

    首先明确一下概念: json格式数据本质上就是字符串: js对象:JavaScript 中的几乎所有事务都是对象:字符串.数字.数组.日期.函数,等等. json数据的解析: 就是把后端传来的json ...

  3. javaScript中的this关键字解析

    this是JavaScript中的关键字之一,在编写程序的时候经常会用到,正确的理解和使用关键字this尤为重要.接下来,笔者就从作用域的角度粗谈下自己对this关键字的理解,希望能给到大家一些启示, ...

  4. JavaScript中的 this全面解析

    上一章我们排除了一些对this的错误认识和知道了this是在调用函数时被绑定的,完全取决于函数的调用位置.先介绍两个概念:调用位置和调用栈. 调用栈:就是为了到达当前执行位置所调用的所有函数. 调用位 ...

  5. JavaScript中使用eval()方法解析json串

    最近在js用到了eval()方法,在这里做个笔记 当时是这么用的:data = eval("("+data+")"); data为后台向前台传送的一个json串 ...

  6. 前端开发:Javascript中的数组,常用方法解析

    前端开发:Javascript中的数组,常用方法解析 前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array ...

  7. 深入解析Javascript中this关键字的使用

    深入解析Javascript中面向对象编程中的this关键字 在Javascript中this关键字代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如: function TestFun ...

  8. [JavaScript] JS中对Base64的解析

    JS中对Base64的解析 <script type="text/javascript"> /** * UTF16和UTF8转换对照表 * U+00000000 – U ...

  9. 解析JavaScript中apply和call以及bind

    函数调用方法 在谈论JavaScript中apply.call和bind这三兄弟之前,我想先说下,函数的调用方式有哪些: 作为函数 作为方法 作为构造函数 通过它们的call()和apply()方法间 ...

随机推荐

  1. python 复制/移动文件

    用python实现将某代码文件复制/移动到指定路径下. 场景例如:mv ./xxx/git/project1/test.sh ./xxx/tmp/tmp/1/test.sh (相对路径./xxx/tm ...

  2. 深入理解Linux网络技术内幕——网络设备初始化

    概述    内核的初始化过程过程中,与网络相关的工作如下所示:     内核引导时执行start_kernel,start_kernel结束之前会调用rest_init,rest_init初始化内核线 ...

  3. UITableView简述

    原帖:http://blog.csdn.net/totogo2010/article/details/7642908 Table View简单描述: 在iPhone和其他iOS的很多程序中都会看到Ta ...

  4. Linux:挂载

    挂载

  5. 【论文解读】行人检测:What Can Help Pedestrian Detection?(CVPR'17)

    前言 本篇文章出自CVPR2017,四名作者为Tsinghua University,Peking University, 外加两名来自Megvii(旷视科技)的大佬. 文章中对能够帮助行人检测的ex ...

  6. Vue拖拽组件

    vue开发公众号项目,***产品需要添加一个新的功能.拖拽功能.一听简单.百度上轮子挺多,直接拉一个过来用着就行.然鹅...兴奋之余,却失望至极.东西很多,没有一个能使得.你让我失望,那我就让你绝望. ...

  7. uml建模工具介绍

    应用最广的由两种种1. Rational Rose,它是ibm的 .2.Microsoft的 Microsoft Office Visio® 2003 3.Enterprise Architect.还 ...

  8. c++中的流

    streambuf类为缓冲区提供内存,并提供了用于填充缓冲区,访问缓冲区,刷新新缓冲区和管理缓冲区内存的类方法. ios_base类表示流的一般特征,如是否可读,是二进制还是文本流等. ios类基于i ...

  9. mime type 类型名字应该用多长的字段?

    在使用 FastAdmin 时有 mimetype 字段使用了 50 长度,有小伙伴反应,不够. 在 Linux 服务器上时 xlsx 文件的 mimetype  是 application/vnd. ...

  10. My Router

    新路由 型号:Y1 CPU:单核 链接终端:2 路由系统版本:1.6.6.171.6.9.17 运行时长:0天0小时17分13秒 MAC地址:20:76:93:28:CA:24   LAN口状态 MA ...