zoukankan      html  css  js  c++  java
  • this指向总结:严格模式和非严格模式

    函数中的this指向和当前函数在哪定义和在哪执行的没有任何的关系

    分析this指向的规律如下:

    【非严格模式下】

    1.自执行函数中的this永远都是window

    【案例1】

    var obj = {

      fn:(function(i){

        //this->window

        return function () {

          //this->obj

        }

      })(0)

    }

    2.给元素的某个行为绑定一个方法,当行为触发的时候,执行绑定的方法,此时方法中的this是当前元素

    【案例1】

    oDiv.onClick = function () { // this->oDiv}

    【案例2】

    function fn() {

      //this->window

    }

    oDiv.onClick = function () {

      //this->oDiv

      fn();

    }

    3.方法执行,看方法名前面是否有“.”,有的话,“.”前面是谁this就是谁,没有的话this就是window

    【案例1】

    var obj = { fn:fn };

    function fn() {}

    fn.prototype.aa = function (){};

    var f = new fn

    fn(); // this=window

    obj.fn(); //this=obj

    fn.prototype.aa(); // this->fn.prototype

    f.aa(); // this=f

    f.__proto__.aa(); // this->f.__proto__ ->fn.prototype

    4.在构造函数中,函数体中的this.xxx = xxx中的this是当前类的一个实例

    【案例1】

    function Fn() {

      this.x = 100; // this->f

      this.getX = function() {

        console.log(this); // this->f 因为getX方法执行的时候,“.”前面是f,所以this是f

      }

    var f = new Fn;

    f.getX()

    5.使用call/apply来改变this的指向(一旦遇到call/apply上述四条都没用了)

    【严格模式】

    “use strict”; // 告诉浏览器我们接下来编写的JS代码采用严格模式

    1.只执行函数中的this永远是undefined

    【案例1】

    var obj = {

      fn:(function(i){

        // this->undefined

        return function () {

          // this->obj

        }

      })(0)

    }

    obj.fn();

    2.方法执行,看方法名前面是否有“.”,有的话,“.”前面是谁this就是谁,没有的话this是undefined

    【案例1】

    var obj = {fn:fn}

    function fn () {}

    fn();// this->undefined

    obj.fn() // this->obj

    我们发现严格模式下的this相对于非严格模式下的this的主要区别在于:对于JS代码中没有写执行主体的情况下,非严格模式默认都是window执行的,所以this指向的是window,但是在严格模式下,没有写执行主体,this指向是undefined;

  • 相关阅读:
    CORE Computer Science Conference Rankings 转载
    推荐投稿的相关领域学术会议 zz
    计算机科学相关的国际会议排名及其汇总zz
    隐马尔科夫模型HMM自学(1)
    matlab mex gcc 支持c99
    计算机视觉牛人(转载)_utopialou_新浪博客
    SPECT、PET、CT与MRI成像原理及其特点的比较 转载
    一场雨我们的见证了什么?
    Java异常的概念和分类
    项目报错java.net.bindexception: address already in use: jvm_bind:8080
  • 原文地址:https://www.cnblogs.com/z-dl/p/8953323.html
Copyright © 2011-2022 走看看