接着上一节讲的话,应该轮到“执行上下文栈”了,但是这里不得不插入一节,把this说一下。因为this很重要,js的面试题如果不出几个与this有关的,那出题者都不合格。
其实,this的取值,分四种情况。我们来挨个看一下。
在此再强调一遍一个非常重要的知识点:在函数中this到底取何值,是在函数真正被调用执行的时候确定的,函数定义的时候确定不了。因为this的取值是执行上下文环境的一部分,每次调用函数,都会产生一个新的执行上下文环境。

情况1:构造函数

所谓构造函数就是用来new对象的函数。其实严格来说,所有的函数都可以new一个对象,但是有些函数的定义是为了new一个对象,而有些函数则不是。另外注意,构造函数的函数名第一个字母大写(规则约定)。例如:Object、Array、Function等。

function Foo(){this.name='username';this.year=1999;console.log(this); //Foo {name:"username", year:1999}
}
var f1 = new Foo();
console.log(f1.name); //username
console.log(f1.year); //1999

以上代码中,如果函数作为构造函数用,那么其中的this就代表它即将new出来的对象。

注意,以上仅限new Foo()的情况,即Foo函数作为构造函数的情况。如果直接调用Foo函数,而不是new Foo(),情况就大不一样了。

function Foo(){this.name='username';this.year=1999;console.log(this); //Window {stop: function, open: function, alear: function, confirm: function, prompt: function....}
}
Foo();

这种情况下this是window,我们后文中会说到。

情况2:函数作为对象的一个属性

如果函数作为对象的一个属性时,并且作为对象的一个属性被调用时,函数中的this指向该对象。

var obj = {x: 10,fn: function(){console.log(this); //Object {x:10, fn:function}console.log(this.x);//10}
}
obj.fn();

以上代码中,fn不仅作为一个对象的一个属性,而且的确是作为对象的一个属性被调用。结果this就是obj对象。

注意,如果fn函数不作为obj的一个属性被调用,会是什么结果呢?

var obj = {x: 10,fn: function(){console.log(this); //Windowconsole.log(this.x); //undefined}
}
var fn1 = obj.fn;
fn1();

如上代码,如果fn函数被赋值到了另一个变量中,并没有作为obj的一个属性被调用,那么this的值就是window,this.x为undefined。

情况3:函数用call或者apply调用

当一个函数被call和apply调用时,this的值就取传入的对象的值。至于call和apply如何使用,不会的朋友可以去查查其他资料,本系列教程不做讲解。

var obj = {x: 10;
}
var fn = function(){console.log(this); //Object {x: 10}console.log(this.x); //10
}
fn.call(obj);

情况4:全局 & 调用普通函数

在全局环境下,this永远是window,这个应该没有非议。

console.log(this === window ); //true

普通函数在调用时,其中的this也都是window。

var x = 10;
var fn = function() {console.log(this); //Window {stop: function, open: function, alert:function....}console.log(this.x);
}
fn();

以上代码很好理解。
不过下面的情况你需要注意一下:

var obj = {x: 10,fn: function(){function f(){console.log(this); // Window{stop: function....}console.log(this.x); // undefined}f();}
}
obj.fn();

函数f虽然是在obj.fn内部定义的,但是它仍然是一个普通的函数,this仍然指向window。

完了。
看到了吧,this有关的知识点还是挺多的,不仅多而且非常重要。
最后,既然提到了this,有必要把一个非常经典的案例介绍给大家,又是jQuery源码的。

以上代码是从jQuery中摘除来的部分代码。jQuery.extend和jQuery.fn.extend都指向了同一个函数,但是当执行时,函数中的this是不一样的。

执行jQuery.extend(…)时,this指向jQuery;执行jQuery.fn.extend(…)时,this指向jQuery.fn。

这样就巧妙的将一段代码同时共享给两个功能使用,更加符合设计原则。

好了,聊完了this。接着上一节继续说“执行上下文栈”。

深入理解javascript原型和闭包(10)——this相关推荐

  1. 深入理解javascript原型和闭包(17)——补this

    本文对<深入理解javascript原型和闭包(10)--this>一篇进行补充,原文链接:http://www.cnblogs.com/wangfupeng1988/p/3988422. ...

  2. 深入理解javascript原型和闭包(16)——完结

    之前一共用15篇文章,把javascript的原型和闭包. 首先,javascript本来就"不容易学".不是说它有多难,而是学习它的人,往往都是在学会了其他语言之后,又学java ...

  3. 深入理解javascript原型和闭包(3)——prototype原型

    既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...

  4. 深入理解javascript原型和闭包(2)——函数和对象的关系

    上文(理解javascript原型和作用域系列(1)--一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; co ...

  5. 深入理解javascript原型和闭包

    原文链接http://www.cnblogs.com/wangfupeng1988/p/3977924.html 对象是属性的集合. function show(x) {console.log(typ ...

  6. 深入理解JavaScript原型与闭包

    说明 本文为作者学习记录相关笔记及理解,如有不妥之处,请各位读者积极指出, 虽然标题是深入理解,但可能存在许多不够深入的地方,请各位小伙伴不吝赐教 一切都是对象 一切引用类型都是对象,对象是属性的集合 ...

  7. 深入理解javascript原型和闭包(15)——闭包

    前面提到的上下文环境和作用域的知识,除了了解这些知识之外,还是理解闭包的基础. 至于"闭包"这个词的概念的文字描述,确实不好解释,我看过很多遍,但是现在还是记不住. 但是你只需要知 ...

  8. 深入理解javascript原型和闭包(12)——简介【作用域】

    提到作用域,有一句话大家(有js开发经验者)可能比较熟悉:"javascript没有块级作用域".所谓"块",就是大括号"{}"中间的语句. ...

  9. 深入理解javascript原型和闭包(7)——原型的灵活性

    在Java和C#中,你可以简单的理解class是一个模子,对象就是被这个模子压出来的一批一批月饼(中秋节刚过完).压个啥样,就得是个啥样,不能随便动,动一动就坏了. 而在javascript中,就没有 ...

最新文章

  1. Wireshark学习笔记——如何快速抓取HTTP数据包
  2. 【PP】重复制造业务中工作中心变更的问题
  3. Fifth scrum meeting - 2015/10/30
  4. s5pv210——I2C基础详解、I2C时序详解
  5. 单元测试工具 Numega
  6. 动态规划——最长公共子序列(洛谷P1439)
  7. fckeditor异常总结---The server didn‘t reply with a proper XML data. Please check your configuration.
  8. 用Java实现文本编辑器
  9. mysql连接工具_连接MySQL常用工具
  10. 在6.1的PPC上做的cab包里面的html文件,安装后在手机上显示乱码
  11. 用python证明采样定理_这一切都从指数函数开始(4)——采样定理
  12. Word插入的表格如何调整长和宽
  13. 考虑风光火储的微电网优化调度 介绍:考虑风电、光伏、热电机组和储能优化调度,其中负荷考虑冬季或夏季两种场景
  14. 2018年4月份 软件发明专利培训
  15. CSS3 3D空间转换
  16. 基于MATLAB2020b的J. R.S. THOM的水强制循环沸腾压降预测模型压降倍乘系数计算器
  17. 软件测试 | 什么是Web
  18. 普度大学西拉法叶分校计算机硕士,普渡大学西拉法叶分校硕士申请条件
  19. Unity3D中Enabled、Destroy与Active的区别
  20. 兔子繁殖问题(斐波那契数列c语言版)

热门文章

  1. ORACLE 调试输出,字符串执行函数
  2. C#抓取网页程序的实现浅析
  3. Struts 动态Form的验证框架步骤
  4. 上传问题总结(文件大小检测,大文件上传)
  5. linux php7 安装redis扩展(php7可以使用自测)
  6. 第一章 安装OpenResty(Nginx+Lua)开发环境
  7. Git本地与远程配对命令:两种 一种是在推送push时候配对 一种是新建分支checkout -b时候配对
  8. PHP版本区别5与7:性能 64位 运算符 输入类型 返回类型 匿名类;7改进1.变量存储空间2.数组结构3.函数调用机制
  9. Basic的Json与Xml
  10. 睡袋放置_第一次露营要带上什么?帐篷、睡袋怎么挑、怎么买?新手入门攻略...