JQuery/PHP

深入理解JavaScript中的this关键字

也想出现在这里?联系我们
创客云

首先,我们要知道 this 是什么。它的含义。通俗的来说, this 首先是一个对象,其次要知道的是 this 不是由它本身出现在何处来决定的。

而是由调用它的对象来决定的,可以简单的理解为。是谁调用了 this,那么 this 便代表谁。比如在全局作用域中调用 this。那么此时的 this 便代表着全局变量。

也想出现在这里?联系我们
创客主机

例:

console.log(this === window)

如上文说所的来分析,如是在全局作用域中。this 则代表着全局变量。也就是 window,那么事实是不是这样呢。运行上面的代码,输出 true。证明 this 的却是 window.

如果 this 是在一个对象中出现,那么正常情况下。this 则代表该对象。

例:

  1. var obj = {
  2.       fn:function(){
  3.             console.log(this === obj);
  4.     }
  5. }
  6. obj.fn();//true

弄明白了这两点,this 的真相似乎已经浮出水面了。下面我们来看一个复杂点的例子。相信有很多人都会犯错,同时这也是一道经典的面试题。

  1. var length = 20;
  2. function fn(){
  3.         console.log(this.length);
  4. }
  5.  
  6.  
  7. var o = {
  8. length:10,
  9. e:function (fn){
  10.         fn();
  11.       arguments[0]();
  12. }
  13. }
  14.  
  15. o.e(fn);

相信有不少的同鞋会认为让面会输出 20,20; 也有少部分人认为是 10,10; 或者 20 10,10 20;

但是很遗憾,上面的答案全部错误。先不急着公布正确答案,我们来分析一下,看看在运行中 this 到底代表什么。

当运行 o.e(fn);时,e 中的 this 代表着 o。因为是 o 调用了 e。这点相信大家都没有疑问。

当进入 e 时。执行 fn(); 此时的 fn 也就是参数传递进来的 fn,由于函数名只是保存了一个指向函数的引用。所以此时 e 内部的 fn 与外面的 fn 是一模一样的。又因为函数内部的 this 是由函数的调用者决定的。所以此时 fn 内的 this 代表了 window。这点相信当家也没有疑问。

当执行 arguments[0]()时,由于 arguments[0]是函数的第一个参数,等于 fn。所以此时的函数也就等于外部的 fn,理论上来说 this 也应该是等于 window 的。

似乎这么解释是合理的。 那么正确答案就应该是 20,20.那么我又为何说上面的答案中没有一个是正确的呢。那是因为我们忽略了一点。那就是,arguments。

由于 arguments[0]().相当与 arguments.0(); 也就是说,正真调用 fn 的是 arguments。所以函数内部的 this 应该是 arguemnts,所以。this.length 等于参数的个数,也就是 1.正确答案是 20 1.

相信大家都明白了吧,那么下面我们就来看看是什么样的机制造就了 this。

首先,当一个函数被运行时。他都会进入一个新的执行环境,就算是同一个函数两次调用,异或是函数自身递归调用,它们所进入的执行环境都是不同的。

当进入这个执行环境的时候,就会创建一个活动对象,并且关联到执行环境中。并且随之确定函数的作用域链,this 等。所以 this 的值与它在那里出现没有关联。反而跟函数的调用者有关。

所以,只要记住。this 就是调用函数的那个对象。那么 this 就不会在被 this 相关的问题给难住啦~

本文由 云模板 作者:PetitQ 发表,转载请注明来源!

也想出现在这里?联系我们
创客主机

发表评论

热销模板

Nastik - 创意企业作品展示网站WordPress汉化模板

Envato

本站承接 WordPress / PbootCMS / DedeCMS 等
系统建站、仿站、开发、定制等业务!

精品专区

Contact us all-in-one button with callback - 轻量级侧边按钮客服插件,允许设置自定义的提示语,还支持添加无限数量的联系方式,不仅支持国内的微信二维码、QQ等主流程序,还支持几乎所有国外的热门社交工具、及时聊天程序等,演示参考我们官网右下角客服按钮。

购买插件