最近,听到李笑来说,讲解编程的过程中,举例子很重要。

而且,我最近看的各种javaScript工具书中的例子,也都有点复杂。

所以啊,我试着举一些简单又直观的例子,与各位苦学javaScript的同学,一起共勉!

这些例子里面,我将变量名称、函数名称尽量写短,让大家的精力,主要投入到理解逻辑,理解和整理思路上来,不要为长长的变量名、函数名称所干扰。

先抛出一个问题:

this是什么?this表达了什么?为什么要有this?

统计学生成绩的小例子,

对象s(scores的缩写)存储了三位同学的考试成绩,通过函数t(total的缩写)获得总分数,

var s= { ma: 90, li: 80, zhao: 70 }function t(n){ return n.ma+ n.li + n.zhao;}console.log("学生总成绩:"+t(s));

对象s被当做函数t的形参x,显式的传入了该函数内.

运行结果:

使用node命令查看

不使用参数的情况下,怎么办?

想隐式的传递对象,怎么办?

我们使用函数的上下文,函数的上下文,是除了函数的参数之外的、最常用的,让外部信息隐式的进入函数内的一种手段。

将上面的代码改一下:

var s= { ma: 90, li: 80, zhao: 70, t: t } function t(){ return this.ma + this.li + this.zhao; } console.log("学生总成绩:"+s.t());

上面的代码,去掉了函数t的形参,添加了this,然后在s对象内添加了函数t。

总结:函数的this是什么,前提条件是要看如何调用,不是看它如何定义。

再举一个大家生活中常见的例子,

大家出门时,要带上手机、钥匙、钱包,为了记住这些出门必带的东东,有人编了段子“伸手钥钱”,

那么,在javaScript中,我用函数调用链,把3样东西串起来,

3样东东,分别用拼音首字母代替:手机 --> sj , 钥匙 --> ys , 钱包 --> qb 。

我们想要的结果是,只需带上手机(执行函数sj),就能把3个东东都带上。

实例1:出门三件事:手机、钥匙、钱包

function sj(){ 'use strict';//使用严格模式 console.log('手机'); this.ys();}function ys(){ console.log('钥匙'); this.qb();}function qb(){ console.log('钱包');}sj();

上面的例子,试图跨越边界,使用this来隐式的引用函数的词法作用域,能成功吗?

先看结果:

使用node命令查看

结果报错了,当然,我们使用了严格模式,在浏览器运行的结果:

使用浏览器查看

上面的例子中,我们试图通过this.ys()来引用ys()函数,在严格模式下是不能成功的。(偷偷告诉你,非严格模式下chrome浏览器运行不报错)

想拿钥匙?

调用ys()最自然的方法是省略前面的this,请直接使用词法引用标示符ys()

使用node命令和运行在浏览器的结果

通过这个例子使用this和不使用this的对比,我们知道了:

this在任何情况下都不指向函数的词法作用域。

我再补充一点调用位置的知识,

调用位置就是函数在代码中被调用的位置,不是声明的位置

调用栈——为了到达执行位置所调用的所有函数,

这两个小知识,还是通过上面那个例子来解释。

function sj(){//当前调用栈是sj(手机)//调用位置是全局作用域 console.log('手机'); ys();//ys(钥匙)的调用位置}function ys(){//当前调用栈是sj(手机)--> ys(钥匙)//当前调用位置在sj(手机)中 console.log('钥匙'); qb();//qb(钱包)的调用位置}function qb(){//当前调用栈是sj(手机)--> ys(钥匙)--> qb(钱包)//当前的调用位置在ys(钥匙)中 console.log('钱包');}sj();

理解了调用位置和调用栈,才能理解this的绑定过程。

如何延长作用域链_通过实例理解javaScript中的this到底是什么和它的词法作用域...相关推荐

  1. spring aop实例讲解_小实例理解Spring中的AOP----面向切面编程

    关于面向切面编程(Spring AOP),是在java面试中经常提及的,只有在充分理解了,日常工作中才能得心应手. 如何理解AOP呢?首先我们要思考为什么要使用切面编程,如下图: 对于一个系统来说保存 ...

  2. 如何延长作用域链_第4部分2:作用域(链)和 闭包

    知识列表作用域/作用域链 闭包(涉及JS垃圾回收机制 )https://zhuanlan.zhihu.com/p/27110726 [ js 基础 ][读书笔记]作用域和闭包https://jueji ...

  3. 理解JavaScript中的原型与原型链

    理解JavaScript中的原型与原型链 原型链是一种机制,指的是JavaScript中每个内置的对象都有一个内置的__proto__属性指向创建它的构造函数的prototype(原型)属性.原型链的 ...

  4. javascript 符号_理解JavaScript中“ =”符号的直观指南

    javascript 符号 by Kevin Kononenko 凯文·科诺年科(Kevin Kononenko) 理解JavaScript中" ="符号的直观指南 (A Visu ...

  5. 理解javascript中的回调函数(callback)【转】

    在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...

  6. 理解JavaScript中的原型继承(2)

    两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...

  7. 理解javascript中的回调函数(callback)

    理解javascript中的回调函数(callback) 在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Obje ...

  8. 十分钟,快速理解JavaScript中的闭包概念

    海阔凭鱼跃,天高任鸟飞.Hey 你好!我是猫力Molly 闭包已经是一个老生常谈的问题了,不同的人对闭包有不同的理解.今天我来浅谈一下闭包,大家一起来就"闭包"这个话题,展开讨论, ...

  9. 理解JavaScript中部分设计模式

    理解JavaScript中部分设计模式 什么是设计模式 在软件工程中,设计模式是软件设计中常见问题可重用的方案.设计模式代表着经验丰富的软件开发人员使用的最佳实践.设计模式可以被认为是编程模板. 为什 ...

最新文章

  1. [HAOI2018]染色
  2. 璧山哪里可以学基础计算机,璧山学电脑在哪里
  3. 定时任务--mysql数据库备份
  4. 阶跃函数和冲击函数相关性质及傅立叶变换求取方法
  5. MySQL / 可重复读到底是怎么实现的?图解 ReadView 机制
  6. linux版本 如何查kali_000_Kali Linux版本查看和apt源配置
  7. 正弦光栅的生成matlab,matlab做正弦光栅衍射的计算机模拟
  8. Bokeh 增加交互方式
  9. Spark Yarn-cluster与Yarn-client
  10. 如何解决SQL Server中SQL身份危机
  11. 【求助】Android开发中的数据持久化
  12. jmeter接口顺序执行_【接口测试】JMeter中各组件执行顺序详解
  13. cad转dwf格式怎么转换?
  14. flink 作业提交流程
  15. kindle如何设置不闪屏_疑问解答 | Kindle翻页为什么闪屏?
  16. 微信授权登陆【yixiyun】
  17. 1+X 云计算平台运维与开发(初级)
  18. 分享40款效果非常漂亮的 HTML5 CSS3 网站模板,模板免费下载
  19. vCode组件的使用
  20. EXCEL中插入图形

热门文章

  1. 使用Spring-hadoop小结
  2. centos 环境变量配置
  3. mui.init方法配置
  4. 1143 多少个Fibonacci数
  5. PHP-php.ini中文版
  6. Qt5:渐变效果的实现
  7. windows下的_mkdir函数
  8. 噪音 - Perlin Noise
  9. css3 固定,CSS3 calc()不适用于固定位置/绝对位置
  10. java 解析 csv_在Java中将数据从CSV解析到数组