在javascript中函数声明会被提升,而函数表达式不会被提升。当函数执行时,会创建一个执行环境和相应的作用域链,然后利用arguments和其他的命名参数的值来初始化函数的活动对象,作用域链链中所有的外部活动对象都处于第二的位置。

  

function compare(num1, num2){
if(num1 < num2){
retunr -1;
}
else if(num1 = num2){
retunr 0;
}
else(num1 > num2){
retunr 1;
}
} var result = compare(5, 10);

1、调用compare函数时,先创建了一个包含this、arguments、num1、num2的活动对象,然后全局作用域包含this、result、compare在作用域链的第二的位置。

2、每个执行环境都有一个表示变量的对象变量对象。全局环境的变量对象始终存在,而compare函数的局部环境的变量对象,只在执行过程存在。

3、在创建compare时,会创建一个预先包含全局变量对象的作用域链,保存在scope属性中。调用compare时会创建一个执行环境,然后通过复制函数的scope的属性中的对象来      构建起执行环境的作用域链,然后又有一个活动对象被创建并,推入执行环境的作用域前端。

4、函数执行完其局部活动对象就销毁了,除非包含闭包。

如果在一个函数内部声明另一个内部的函数,那么内部的函数有权访问包围函数的活动对象,内部函数就是闭包。

在一个函数内部定义的函数会将包含的活动对象添加到作用域链中,在外部函数执行完后,其执行环境的作用域链会被销毁,但活动对象仍然会留在内存,直到内部

的匿名函数被销毁。

闭包保存引用整个外部函数的活动对象,

function ass(){
var element = document.getElementById("id");
elelment.onclick = function(){
alert(element.id);
}
}

创建一个element事件处理的闭包,内部引用了外部整个活动对象,所以这里会有循环引用,取消循环引用

function ass(){
var element = document.getElementById("id");
var id = element.id; //复制属性值,消除循环引用
elelment.onclick = function(){
alert(id);
}
element = null; //取消引用,释放内存
}

注意:匿名函数的执行环境具有全局性,this.通常指向全局作用域window。

var name = "window"

var obj = {
this.name : "in object";
getName:function(){
return :function(){
return this.name;
}
}
} alert(obj.getName()());
输出window,匿名函数执行环境具有全局性。

Javascript高级程序设计——this、闭包、函数表达式的更多相关文章

  1. JavaScript高级程序设计学习笔记--函数表达式

    关于函数声明,它的一个重要特征就是函数声明提升,意思是在执行代码之间会读取函数声明,意思是在执行代码之前会先读取函数声明.这就意味着可以把函数声明放在调用它的语句 后面. sayHi(); funct ...

  2. javascript高级程序设计读书笔记----函数表达式

    定义函数两种方式: 1.函数声明 function sayHi(){ alert("Hi"); } sayHi();//调用函数 2.函数表达式 var sayHi = funct ...

  3. 《JAVASCRIPT高级程序设计》闭包

    一.闭包的概念 闭包是JAVASCRIPT中最重要的概念之一,闭包是指有权访问另一个函数作用域中变量的函数:创建闭包常见的方式,就是在一个函数内部,创建另一个函数.以下的例子创建了一个闭包,加粗的两行 ...

  4. 读javascript高级程序设计16-几条函数小技巧

    内容概要 作用域安全的构造函数 惰性载入函数 函数绑定 函数节流 一.作用域安全的构造函数 我们知道,当使用new操作符调用构造函数时,构造函数内部的this会指向新创建对象的实例. function ...

  5. 读javascript高级程序设计00-目录

    javascript高级编程读书笔记系列,也是本砖头书.感觉js是一种很好上手的语言,不过本书细细读来发现了很多之前不了解的细节,受益良多.<br/>本笔记是为了方便日后查阅,仅作学习交流 ...

  6. 读javascript高级程序设计-目录

    javascript高级编程读书笔记系列,也是本砖头书.感觉js是一种很好上手的语言,不过本书细细读来发现了很多之前不了解的细节,受益良多.<br/>本笔记是为了方便日后查阅,仅作学习交流 ...

  7. JavaScript高级程序设计(读书笔记)之函数表达式

    定义函数的方式有两种:一种是函数声明,另一种就是函数表达式. 函数声明的一个重要特征就是函数声明提升(function declaration hoisting),意思是在执行代码前会先读取函数声明. ...

  8. (读书笔记)函数参数浅析-JavaScript高级程序设计(第3版)

    ECMAScript函数不介意传递的参数个数,因为在其内部是用一个数组进行表示的.在函数体内可以通过arguments对象来访问这个参数数组,就像我们正常访问数组一样处理. arguments对象只是 ...

  9. 《JavaScript高级程序设计(第3版)》阅读总结记录第一章之JavaScript简介

    前言: 为什么会想到把<JavaScript 高级程序设计(第 3 版)>总结记录呢,之前写过一篇博客,研究的轮播效果,后来又去看了<JavaScript 高级程序设计(第3版)&g ...

  10. 《Javascript高级程序设计》阅读记录(七):第七章

    <Javascript高级程序设计>中,2-7章中已经涵盖了大部分精华内容,所以摘录到博客中,方便随时回忆.本系列基本完成,之后的章节,可能看情况进行摘录. 这个系列以往文字地址: < ...

随机推荐

  1. 【Alpha版本】冲刺-Day3

    队伍:606notconnected 会议时间:11月11日 会议总结 张斯巍(433) 今天安排:个人信息界面设计 完成度:100% 明天计划:个人信息界面设计 遇到的问题:ps掌握的还不够熟练,导 ...

  2. 【Phylab2.0】Alpha版本测试报告

    测试报告集 点击链接

  3. Jboss7.1 加入realm auth认证 bootsfaces 美化的登录页面

    jboss-as-7.1.1.Final\standalone\configuration: 1, standalone.xml中 <security-domains>标签里面添加: &l ...

  4. Mysql学习笔记(二)对表结构的增删改查

    有将近一个星期都没有更新mysql了.相反linux的东西倒是学习不少.可能我个人情感上对linux更感兴趣一点.但mysql我也不烦,只是一旦将精力投入到了一样事情上去,就很难将精力分散去搞其他的东 ...

  5. elk系列2之multiline模块的使用

    preface 上回说道了elk的安装以及kibana的简单搜索语法,还有logstash的input,output的语法,但是我们在使用中发现了一个问题,我们知道,elk是每一行为一个事件,像Jav ...

  6. JavaWeb---总结(五)Http协议

    一.什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的 ...

  7. 忘记常访问网站密码怎么办?教你如何查看浏览器已保存的密码,如何简单查看Chome浏览器保存的密码?

    利用场景: 同事或朋友外出有事,电脑未锁屏离开座位.可以利用这一间隙,查看Ta在Chrome浏览器上保存的账号密码 查看逻辑: 当我们要查看Chrome浏览器上保存的密码时,点击显示,会弹出一个对话框 ...

  8. SMO推导和代码-记录毕业论文4

    SMO的数学公式通过Platt的论文和看这个博客:http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html,大概弄懂了.推导以后 ...

  9. 转: CvMat,Mat和IplImage之间的转化和拷贝

    1.CvMat之间的复制 //注意:深拷贝 - 单独分配空间,两者相互独立 CvMat* a; CvMat* b = cvCloneMat(a); //copy a to b 2.Mat之间的复制 / ...

  10. HTML教程

    HTML文档可以包含的内容 通过不同的标签,HTML文档可以包含不同的内容,比如文本,链接,图片,列表,表格,表单,框架等. 文本 HTML对文本的支持是最丰富的,你可以设置不同级别的标题,分段和换行 ...