JS——this

Q&A:

1. apply、call 有什么作用,什么区别?

  • apply
  • 定义fun.apply(thisArg[, argsArray]),改变当前函数的this指向,这样可以使方法在特定对象中使用,而不需要再特定对象中重新写该方法。
  • 参数
    • 第一个参数thisArg是this的指向,即要指定的调用对象,非严格模式下,当为null或undefined时,默认指向全局对象;
    • 第二个参数argsArray是参数数组,在ES5中,可以为类数组对象。该数组传给fun函数以供处理;当无法得知具体有何参数时,可以使用arguments对象代替argsArray;当设置为null或undefined时,表示不需要传入参数。
  • egArray.prototype.join.apply(arguments),让arguments可以使用join方法;补充一点,argument.callee常用于匿名函数,指代函数本身。
  • callfun.call(thisArg[, arg1[, arg2[, ...]]]),与apply作用相同。
  • 区别:call和apply类似,只有第二个参数不同,apply是传入参数数组或者类数组对象,而call是传入参数列表(nodeList)。
  • this:当函数被调用时,this指向调用函数的那个对象。
  • 全局作用下,this指向window对象;
  • 构造函数的this指向构造的对象;
  • apply和call里,指向指定的调用对象;
  • 事件绑定中的this,指向调用事件绑定的document对象;
  • 函数嵌套中的function的this指向window;
  • setTimeout和setInterval中的this指向window;
  • eg:
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>task33</title>
  </head>
  <body>
    <button type="button" id="button">按钮</button>
    <script>
      document.getElementById('button').onclick = function() {
        console.log(this);
      }
      function outerTest() {
        console.log(this);
        function innerTest() {
          console.log(this);
        }
        innerTest();

        setTimeout(function() {
          console.log(this);
        }, 2000);
      }

      outerTest();

    </script>
  </body>
</html>
this指向
    <script>
      var name = 'kevin';
      var obj = {
        name: 'zhao'
      }

      function outerTest() {
        console.log(this.name);
      }
      outerTest();
      outerTest.apply(obj);

    </script>
apply中的this

Coding:

1. 以下代码输出什么?

    <script>
      var john = {
        firstName : "John"
      }
      function func() {
        alert(this.firstName + ": Hi!");
      }
      john.sayHi = func;
      john.sayHi();
    </script>

this指向调用其函数的对象,代码中john对象绑定函数,并且调用函数,所以this指向john对象,所以显示john: H1!

代码1

2. 下面代码输出什么,为什么

    <script>
      func();

      function func() {
        alert(this);
      }
    </script>

默认是全局对象调用函数,所以显示的是window对象:


代码2

3. 下面代码输出什么

    <script>
      function fn0() {
        function fn() {
          console.log(this);
        }
        fn();
      }

      fn0();

      document.addEventListener('click', function(e) {
        console.log(this);
        setTimeout(function() {
          console.log(this);
        }, 200);
      }, false);
    </script>

嵌套函数,在调用的时候,和外层函数一样,也遵循堆栈溢出原则,函数调用时this指向仍然是window;document绑定事件时,this指向document对象,因为调用该方法的是document对象;setTimeout是全局对象window调用的,所以this指向window:


代码3

4. 下面代码输出什么,why

    <script>
      var john = {
        firstName: "John"
      }

      function func() {
        alert(this.firstName);
      }
      func.call(john);
    </script>

call方法的第一个参数是改变调用该方法的this对象,所以显示John:


代码4

5. 代码输出?

    <script>
      var john = {
        firstName: "John",
        surName: "Smith"
      }

      function func(a, b) {
        alert(this[a] + ' ' + this[b]);
      }
      func.call(john, 'firstName', 'surName');
    </script>

call方法,第一个参数是改变调用该方法的this对象,后面的参数是传入的参数,this[a]得到的就是john[firstName]的值:


代码4

6. 以下代码有什么问题,如何修改

    <script>
      var module = {
        bind: function() {
          $btn.on('click', function() {
            console.log(this);
            this.showMsg();
          });
        },
        showMsg: function() {
          console.log('饥人谷');
        }
      }
    </script>

this只有在函数被调用的时候才能应用,当$btn被点击时,this指向$btn而不是module,所以在bind里调用不了showMsg()方法,应该改成:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>task33</title>
  </head>
  <body>
    <button type="button" id="btn">按钮</button>
    <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <script>
      var $btn = $('#btn');
      var module = {
        bind: function() {
          var cur = this;  // 保存对象的this
          $btn.on('click', function() {
            console.log(cur);
            cur.showMsg();
          });
        },
        showMsg: function() {
          console.log('饥人谷');
        }
      }
      module.bind();
    </script>
  </body>
</html>
代码6

本文归饥人谷和本人所有,如需转载请注明来源

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • 参考链接 this 关键字 深入理解上下文this 慕课视频 基本含义 以上示例中实际都是执行的showName方...
    day_day_up阅读 778评论 2 3
  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 6,922评论 15 54
  • 转换为call/apply来看待this的值 彻底搞懂this 阮一峰-this原理 this 由于运行期绑定的特...
    DeeJay_Y阅读 745评论 0 0
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,709评论 2 17
  • 首先要明白,this指向是在创建函数上下文的时候创建的,也就是执行的时候。所以this永远都是指向调用它的那个对象...
    栗子酥小小阅读 898评论 0 1