javascript高程3 学习笔记(三)

执行环境

执行环境是什么?

  • javascript的解释器每次开始执行一个函数时,都会为每个函数创建一个执行环境(execution context)。
  • 执行环境定义了变量或者函数有权访问的其他数据,决定了他们各自的行为。
  • 与执行环境相关的变量对象(ariable object)中有执行环境定义的所有变量和函数

作用域链

  • 代码在一个环境中执行,便会创建变量对象的一个作用域链(scope chain)。
  • 作用域链的作用是,保证对执行环境有权访问的所有变量和函数的有序访问
  • 如果环境是函数,则其活动对象(active object)为环境变量
  • 活动对象最开始含有一个变量,名为arguments对象(该变量全局中不存在)
  • 作用域链的下一个对象来自包含对象,再下一个对象来自下一个包含环境...
  • 标识符的解析是沿着作用域链逐级向上搜索标识符的过程
  • 通过try catch/with 来延长作用域
  • 没有块级作用域(类C的花括号)

代码示例

var color = "blue";function changeColor(){if(color == "blue"){color = "red";}else{color = "blue";}
}
changeColor();
alert(color); // red
var color = "blue";function changeColor(){var anotherColor = "red";function swapColor(){var tempColor = anotherColor;anotherColor = color;color = tempColor;// 能访问 color和anotherColor,tempColor}
// 能访问 color和anotherColorswapColor();alert(color);alert(anotherColor);
}
// 能访问 color 
changeColor();
alert(color);
alert(anotherColor);  //不能被访问到 undefined<pre><code><br />####js 垃圾回收 Garbage Collection(GC)
&gt; - javascript具有自动垃圾回收机制
- 两种策略,标记清除和引用计数
​- 标记清除(较为常见),第一遍标记所有变量,第二次标记待清除变量
- 引用计数,通过检测变量引用次数的值判定是否变量可以被回收,问题是存在循环引用问题####Function 类型
&gt; - 每个函数都是Function类型的实例
- 函数是对象,具有属性和方法,函数名实际上便是指向函数对象的指针
- 函数定义的三种方式 
- 函数没有重载,后定义的会覆盖之前的
- 将函数名作为变量进行传参
- 函数的两个内部属性**`arguments`**和**`this`**还有一个**`caller`**
- 函数的属性(有个疑问,和内部属性什么区别么),两个`length`(参数个数)和`prototype`
- 两个非继承方法`apply()` `call()`####代码示例
*函数的三种定义方式*
</code></pre>// 函数定义的三种方式
// 函数声明
function sum(num1,num2){return num1 + num2;
}// 函数表达式
var sum  = function(num1,num2){return num1 + num2;
};// 使用Function构造函数  两次代码解析性能慢 不推荐
var sum = new Function("num1","num2","return num1 + num2");<pre><code>​*函数声明提升(function declaration hositing)*
</code></pre>// 可以访问sum
alert(sum(10,10));
function sum(num1,num2){return num1 + num2;
}// 函数表达式则不行
alert(sum1(10,10));
var sum1 = function(num1,num2){return num1 + num2;
}<pre><code>这是因为解析器在向执行环境加载数据时候,对于函数声明和函数表达式,解析器会率先读取函数声明,使其在任何代码之前可用(可以访问)  *作为值的函数,函数名做为变量进行传参*
</code></pre>function callSomeFunction(someFunction,someArgument){return someFunction(someArgument);
}function add10(num1){return num1 + 10;
}var result = callSomeFunction(add10,10);
alert(result);<pre><code><br />*函数的内部属性*  
arguments对象上一篇笔记提及,类数组对象包含传入函数的所有参数  
arguments对象拥有一个名为 `callee`的属性,该属性是一个指针,指向arguments对象的函数  
它的作用:
</code></pre>function factorial(num){if(num <= 1){return 1;}else{// return num * factorial(num - 1);return num * arguments.callee(num - 1);}
}var trueFactorial = factorial;
factorial = function(){return 0;
}
alert(trueFactorial(5)); // 120
alert(factorial(5)); // 0<pre><code>`callee`作为指针的用法,解除了函数体内代码和函数名的耦合  **`this`**(很重要,要理解掌握)  
this引用的是函数据以执行的环境对象或者说是this值(全局作用域调用函数时,this指向的引用就是window)  
</code></pre>window.color = "red";var o = {color:"blue"
};
function sayColor(){alert(this.color);
}sayColor();o.sayColor = sayColor; // 函数名是指向函数的指针
o.sayColor();<pre><code>可以通过调试代码,查看当前所在的this指向的环境对象  
**疑问:如果window.color 直接写color/var color,不是应该也是指向全局的么,为什么会报undefined***两个非继承的方法apply() call()*  
</code></pre>// apply() call() bind()
function sum(num1,num2){return num1 + num2;
}function applySum(num1,num2){return sum.apply(this,arguments); // 传入arguments// return sum.call(this,[num1,num2]; //或者传入数组
}
alert(callSum(10,10));
function callSum(num1,num2){return sum.call(this,num1,num2);
}
alert(callSum(10,10));<pre><code>​*apply()和call() 的作用在于 扩充函数作用域(不明觉厉)*  
</code></pre>window.color = "red";
var o = {color:"blue"
};
function sayColor(){alert(this.color);
}var objectSayColor = sayColor.bind(o); // bind方法 传入对象o
objectSayColor();sayColor();
sayColor.call(this);
sayColor.call(window);
sayColor.call(o);

小结

  1. 执行环境的概念
  2. 什么是作用域,作用域链的作用
  3. 函数是个对象,有相应的属性和方法
  4. 前面的哪个疑问 是什么原因?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一张纸还能上天能救命?理工男宁愿放弃NASA百万年薪,也要回家折纸?!

全世界有3.14 % 的人已经关注了爆炸吧知识一张纸能做什么&#xff1f;小时候&#xff0c;它可能默默记录着你天马行空的想象力&#xff1a;而到了艺术家手中&#xff0c;它们就会变幻成各种各样精妙绝伦的艺术品&#xff1a;可当一双文艺的手&#xff0c;遇上一颗聪明无比的“理…

【干货】单日10亿GMV的.NET5电商平台,是如何设计的?

自京东和唯品会转了Java&#xff0c;.NET就一直缺乏高并发电商案例&#xff0c;.NET5能做高并发电商吗&#xff1f;必须的&#xff0c;别停留在.NET Framework的旧印象了&#xff01;这里为大家分享一家上市公司的项目案例&#xff0c;纯.NET5电商平台&#xff0c;轻松承接双11…

如何发送html email,如何发送HTML电子邮件?

我已经使用JMS在Web应用程序中成功发送了电子邮件&#xff0c;但是结果仅以纯文本显示。我希望内容能够显示html。我该怎么做&#xff1f;这大致就是我所拥有的&#xff1a;Message msg new MimeMessage(mailSession);try{msg.setSubject("Test Notification");msg.…

通过 Lotus Domino Java 代理消费 Web 服务

Web 服务是一种允许两台或更多的计算机在网络中交互的系统设计。这种服务的主要优点是&#xff0c;它是在多台不同操作系统的计算机和应用服务器之间发送对象的标准解决方法。例如&#xff0c;我们的公司使用 Web 服务从一台运行 Microsoft .NET Framework 的计算机向基于 IBM …

goahead如何使用cgi服务_QQ如何设置使用代理服务器?

很多人可能会问了&#xff0c;QQ上可以设置代理服务器吗?答案是可以的。今天就为大家详细介绍一下&#xff0c;如何在QQ上设置代理服务器的。1、双击QQ图标&#xff0c;打开QQ登录界面&#xff0c;我们就可以看到界面右上角有一个“设置”按钮。QQ如何设置使用代理服务器12、点…

自动布局AutoLayout

http://www.th7.cn/Program/IOS/201410/304252.shtml转载于:https://www.cnblogs.com/runer/p/4430675.html

android listview添加数据_Android面经分享,失业两个月,五一节前拿到offer

秦子帅明确目标&#xff0c;每天进步一点点.....作者 | 天天有道地址 | juejin.im/post/5eb01866f265da7b9c24562c基本介绍今天介绍一位朋友的经历&#xff1a;从3月初开始复习&#xff0c;准备面试题。复习的资料主要为《Android开发艺术探索》和jsonchao的博客&#xff0c;…

Dapr + .NET 实战(四)发布和订阅

什么是发布-订阅发布订阅是一种众所周知并被广泛使用的消息传送模式&#xff0c;常用在微服务架构的服务间通信&#xff0c;高并发削峰等情况。但是不同的消息中间件之间存在细微的差异&#xff0c;项目使用不同的产品需要实现不同的实现类&#xff0c;虽然是明智的决策&#x…

词性分法程序

http://tieba.baidu.com/p/1180650771?pid13814874186&cid0#13814874186 给你个函数看看,分析下有什么用 句列表指针 存储的是一句话的数据,其中已经分好词,并知道每个词的词性.周春海(专有名词) 是(动词) 周依言(专有名词) 的(的词) 爸爸(抽象名词) .(句号词)程序里的词性…

计算机信息处理教案,冀教版七年级信息技术第二课计算机--信息处理工具 教案...

ID:10796280分类&#xff1a;江苏,2019资源大小&#xff1a;22KB资料简介:《第二课 计算机——信息处理工具》教学设计教 者&#xff1a;课时1教学内容&#xff1a;第二课 计算机——信息处理工具教学目标&#xff1a;1知识目标&#xff1a;学生应了解计算机的工作原理&#xf…

这些数学趣图,数学老师看了后会怎么想?

全世界有3.14 % 的人已经关注了爆炸吧知识这个扣分不?我的人生98%的时间都是无比正确的数学与我不能言语的关系最深情的告白限速是......当我完成数学作业后....维生素C的来历高数课堂恩..... 来拜师了啊, 好好学习. 为师给你命名: 阿尔法狗.这个是驻点, 这是最值, 这些机器学…

COM 组件设计与应用(六)

一、前言  1、与 《COM 组件设计与应用(五)》的内容基本一致。但本回讲解的是在 vc.net 2003 下的使用方法&#xff0c;即使你不再使用vc6.0&#xff0c;也请和上一回的内容&#xff0c;参照比对。   2、这第一个组件&#xff0c;除了所有 COM 组件必须的 IUnknown 接口外&…

为什么不可以使用哈曼顿距离_请对比下欧式距离和曼哈顿距离的差别

●今日面试题分享●在k-means或kNN&#xff0c;我们常用欧氏距离来计算最近的邻居之间的距离&#xff0c;有时也用曼哈顿距离&#xff0c;请对比下这两种距离的差别解析&#xff1a;欧氏距离&#xff0c;最常见的两点之间或多点之间的距离表示法&#xff0c;又称之为欧几里得度…

dmidecode常用的查询

1、查看内存槽数、那个槽位插了内存&#xff0c;大小是多少dmidecode|grep -P -A5 "Memory\sDevice"|grep Size|grep -vRange2、查看最大支持内存数dmidecode|grep -P \Maximum\sCapacity\3、查看槽位上内存的速率&#xff0c;没插就是unknown。dmidecode|grep -A16 …

python 柱状图 间距_专题第18篇:Python 绘图入门

我的施工之路1我的施工计划2数字专题3字符串专题4列表专题5流程控制专题6编程风格专题7函数使用8面向对象编程(上篇)9面向对象编程(下篇)10十大数据结构11包和模块使用总结12Python正则专题总结13设计模式14Python时间模块总结15 Python 装饰器16 Python 迭代器17 Python 生成器…

WPF实现截屏(仿微信)

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 前言有小伙伴需要在软件反馈窗体增加截图功能需求&#xff0c;所以今天来实现一个仿微信的截图。01—效果预览效果预览&#xff08;更多效果请下…

我妈要把闺蜜介绍给我当女朋友......

1 反正手没闲着啊▼2 这...这女孩子不会是您跳广场舞认识的吧&#xff1f;▼3 这就是生活▼4 有画面感了▼5 这种运动会想想就觉得很好看▼6 电脑屏幕不亮手机玩起来不够舒服▼7 这种脱衣方式可真是太酷啦&#xff01;▼你点的每个赞&#xff0c;我都认真当成了喜欢

用回溯法找出n个自然数中取r个数的全排列

回溯法也称为试探法&#xff0c;该方法首先暂时放弃关于问题规模大小的限制&#xff0c;并将问题的候选解按某种顺序逐一枚举和检验。在回溯法中&#xff0c;放弃当前候选解&#xff0c;寻找下一个候选解的过程称为回溯。本实例是用回溯法输出n个自然数中以r个数全排列。代码如…

topic数量是指什么_一个网站的IP、UV和PV到底是什么

在百度统计后台会看到“IP统计”、“UV统计”、“PV统计”&#xff0c;那么、什么是IP&#xff0c;什么是UV&#xff0c;什么又是PV&#xff0c;三者之间有什么关系&#xff0c;IP重要&#xff0c;还是UV重要&#xff0c;还是PV重要。什么是IP&#xff1f;IP即&#xff1a;Inte…

发布一个博客园专用Windows Live Writer代码插件

一直用Windows Live Writer写博客&#xff0c;不过没找到能与博客园配合得很好的代码插件&#xff0c;每次写完文章发布到博客园总要手动修改代码。所以我自己写了一个博客园专用的Windows Live Writer代码插件&#xff08;我知道这世界上已经有N个代码插件&#xff0c;好吧&am…