在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. python增删改查(四)

    ###增删改查 names = ["zhangding","wangxu","wudong","cheng"] #增 n ...

  2. f

     module.exports = util; }); 除了define之外,我们看到module.exports = util;这一句比较特殊.这句是在说,我util模块向外暴露的接口就这些,其他所 ...

  3. vim 使用总结

    VIM分屏显示   1 . 水平分屏split(sp) || 垂直分屏vsplit(vs) :(v)split 输入这样的命令后vi就会将当前的窗口平分为两个,并且在这两个窗口中显示的是同一篇文章.如 ...

  4. re正则表达式7_{}

    curly brackets {} instead of one number, you can specify a range by writing a minimum,a comma,and a ...

  5. HTML学习笔记——head、body及简单标签

    1> title标签.网站关键词.网站描述.实现百度网的跳转 2> 单标签.对标签.p标签 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...

  6. JavaWeb学习笔记——开发动态WEB资源(七)bookapp

    该工程的功能是实现一个bookapp 1.开发注册页面,注册使用properties文件,存储在classpath跟路径 2.注册成功跳转到登录页面 3.输入用户名密码登录,登录成功跳转到book显示 ...

  7. Android学习笔记——download

    该工程的功能是实现从网上的链接下载一个lrc文件和一个mp3文件 以下代码是MainActivity.java中的代码 package com.example.download; import com ...

  8. UnExpected Error, Quitting

    UnExpected Error, Quitting VB在win7 环境安装后,启动vb6.0弹出以上英文提示,目前解决方法: 下载动态库,放置于C:\ProgramFiles\Common Fil ...

  9. linux远程登录(Telnet、SSH)

    系统:RHEL 5.5 64位,使用CentOS的yum源并作更新处理 参考书目<Linux兵书>/电子工业出版社/刘丽霞,细节之处稍有变动. 一.Telnet(远程登录推荐SSH) 1. ...

  10. nuget包管理器控制台下的powershell脚本介绍

    http://personball.com/powershell/2016/07/15/powershell-tips 定制自己的powershell,减少重复工作 安装一系列自己的常用nuget包 ...