JavaScript权威设计--JavaScript函数(简要学习笔记十二)

1.作为命名空间的函数

有时候我们需要声明很多变量。这样的变量会污染全局变量并且可能与别人声明的变量产生冲突。

这时。解决办法是将代码放入一个函数中,然后调用这个函数。这样全局变量就变成了

局部变量。

如:

function my(){

}
my();    //别忘记调用

这段代码定义了一个单独的全局变量:名叫"my"的函数。

我们还可以这么写,定义一个匿名函数:

(function(){       //这里第一个左括号是必须的,如果不写,JavaScript解析器会将
                           //function解析成函数声明语句,使用的话解析成函数定义表达式

}())    //这里的()的作用是,函数定义完毕后立即调用它。

2.闭包

理解一(某书):

函数的执行依赖于变量作用域。为了实现这种词法作用域,必须引用当前的作用域链。

函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,

这种特性在计算机科学中称为“闭包”。

从技术角度上讲,所有的JavaScript函数都是闭包:他们都是对象,他们都关联到作用域链。

调用函数时闭包所指向的作用域链和定义函数时的作用域链不是同一个作用域链时,事情就变得非常微妙。

理解二(某书):

闭包是指有权访问另一个函数作用域中的变量的函数。

创建闭包的常见方式:就是在一个函数内部创建另一个函数。

这里照搬书上的解释:

函数被调用的时候会发生什么?

当函数被调用的时候,会创建一个执行环境和作用域链然后使用参数来初始化函数的活动对象。在作用域链中,外部函数的活动对象始终处于第二位。

一般来讲,当函数执行完毕后,局部活动对象(我理解为局部变量)就会被销毁,内存中仅保存全局作用域(全局执行环境的变量对象)。

作用域链的作用是保证对执行环境的所有变量和函数的访问。

但是在闭包中情况则不同!

内部函数会将外部函数的活动对象添加到它的作用域链中。在匿名函数从外部函数被返回后,它的作用域链被初始化为包含外部函数的活动对象和全局变量的对象。

这样匿名函数就可访问外部函数中定义的所有变量。当外部函数执行完毕后,其活动对象也不会被销毁。因为匿名函数的作用域链仍然在引用这个活动对象。也就是外部函数的作用域链会被销毁,但是他的活动对象仍然会留在内存中。直到匿名函数被销毁后,外部函数的活动对象才会被销毁。

(闭包这玩意儿有点麻烦- -,这里不敢举例子来混乱大家的思维,即使是这书上的例子我觉得也不怎么能很好的解释闭包,大家可以查查资料,有自己的理解)

3.闭包与变量:

作用域链的这种配置机制引出一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值。闭包保存的是整个变量对象,而不是某个特殊的变量。

function a(){
var arry=[];

for(var i=0;i<10;i++){
arry[i]=function(){
return i;
        }
    }
return arry;
}

上面这个例子,与我们想要的结果不一样。每个都是返回10。因为每个函数的作用域链中都保存着擦ca()函数的活动对象,所以他们引用的都是同一个函数变量i。

当ca()返回后,变量i的值都是10。这时我们可以通过创建另一个匿名函数强制让闭包的行为符合预期。

function ca(){
    var arry=new Arry();
    for(var i=0;i<10;i++){
        arry[i]=function(num){
            return function(){
                return num;
            }
        }
    }
    return arry;
}

我们没有直接把闭包函数赋值给数组,而是定义了一个匿名函数,并将立即执行该匿名函数的结果赋值给数组。

4.Fuction()构造函数

函数可以通过function()构造函数来定义:

var f=new Fuction("x","y","return x*y;");
//->等价于
var f=function(x,y){
    return x*y
}

5.constructor属性

每个JavaScript函数都自动拥有一个prototype属性。这个属性的值是一个对象,这个对象包含唯一一个不可枚举属性constructor。constructor属性的值是一个函数对象。

先看代码:

var F=function(){}    //这是一个函数对象
var p=F.prototype;    //这是F相关联的原型对象
var c=p.constructor;    //true
c===F    //对于任意函数F.prototype.constructor==F

可以看到构造函数的原型中预先定义好的constructor属性,这意味着对象通常继承的constructor均指代他们的构造函数。由于构造函数是类的"公共标识"因此这个constructor属性为对象提供了类。

var o=new F();    //创建类F的一个对象
o.constructor===F    //true,constructor属性指代这个类

6.多catch从句

在JavaScript 1.5中,try/catch可以使用多catch从句

如:

try{
    //这里肯呢个会抛出多种类型异常
    throw    1;
}
catch(e if e instanceof ReferenceError){
    //这里处理引用错误
}
catch(e if e==="quit"){
    //这里处理抛出的字符串是"quit"的情况
}
catch(e if typeof e==="string"){
    //处理其他字符串的情况
}
catch(e){
    //处理剩下的异常
}
finally{
    //finally从句正常执行
}
时间: 2024-08-02 19:23:08

JavaScript权威设计--JavaScript函数(简要学习笔记十二)的相关文章

JavaScript权威设计--事件处理介绍(简要学习笔记十七)

1.事件相关概念 事件类型:一个用来说明发生什么类型事件的字符串 事件目标:是发生的事件或与之相关的对象. 事件处理程序(事件监听程序):是处理货响应事件的函数. 事件对象:是与特定事件相关并且包含有关该事件详细信息的对象. 事件传播:是浏览器决定哪个对象触发其事件处理程序的过程. 事件捕获:在容器元素上注册的特定处理程序有机会再事件传播打破真实目标之前拦截它. 阻止标签默认事件的发生 2.Window事件 focus,blur不冒泡.focusin,focusout冒泡. load当文档和其他

JavaScript权威设计--Window对象(简要学习笔记十三)

1.Window对象是所有客户端JavaScript特性和API的主要接入点. Window对象中的一个重要属性是document,它引用Document对象. JavaScript程序可以通过Document对象和它包含的Element对象遍历和管理文档. 2.URL中的JavaScript 在URL后面跟一个JavaScript:协议限定符.里面的代码会作为JavaScript代码进行运行,需用分号分割. 如: <a href="javascript:alert('OK!')"

JavaScript权威设计--JavaScript函数(简要学习笔记十)

1.函数命名规范 函数命名通常以动词为前缀的词组.通常第一个字符小写.当包含多个单词时,一种约定是将单词以下划线分割,就像"like_Zqz()". 还有一种就是"likeZqz()".有些些函数是用作内部用的或者为私有函数通常以一条下划线为前缀,就像"_zqzName()". 2.以表达式方式定义的函数 如: var zqz=function (){ return "zhaoqize"; } 在使用的时候必须把它赋值给一个变

javascript权威指南第6版学习笔记

javascript权威指南第6版学习笔记 javascript数组.函数是特殊对象 看一点少一点. 3.1.4 hello.js内容是 var x=.3-.2;var y=.2-.1 console.log(x==y);console.log(x==.1);console.log(y==.1); 控制台输出结果: 3.1.5 var now = new Date();console.log(now); 3.2 文本 Javascript没有字符型,只有字符串. 16位怎么理解 3.10 变量作

JavaScript字符串常用操作函数之学习笔记

字符串简介 使用英文单引号或双引号括起来,如:’Hello’,”World”,但是不能首尾的单引号和双引号必须一致,交错使用,如果要打印单引号或者双引号,可以使用转义字符\’(单引号),\”(双引号)  代码如下 复制代码 var str_1 = 'Hello World!';  //Hello World!var str_2 = "Hello World!";  //Hello World!var str_3 = '他说:"这样可以的."';  //他说:&quo

《Hibernate学习笔记十二》学生、课程、分数关系的设计与实现

<Hibernate学习笔记十二>学生.课程.分数关系的设计与实现 这个马士兵老师的Hibernate视频学习的一个题目,这里面要用到多对多.多对一的关联关系以及联合主键,因此觉得挺好的,自己写篇博文来记录下. 先考虑数据库表 1.学生表:为简单起见,只考虑了学生id和学生姓名,其中id为主键 2.课程表:为简单起见,只考虑了课程id和课程名称,其中id为主键 3.分数表 分数表有两种解决方案 3.1 第一种为:使用联合主键:student_id 和 course_id 3.2 第二种:不使用

Swift学习笔记十二:下标脚本(subscript)

下标脚本就是对一个东西通过索引,快速取值的一种语法,例如数组的a[0].这就是一个下标脚本.通过索引0来快速取值.在Swift中,我们可以对类(Class).结构体(structure)和枚举(enumeration)中自己定义下标脚本的语法 一.常规定义 class Student{ var scores:Int[] = Array(count:5,repeatedValue:0) subscript(index:Int) -> Int{ get{ return scores[index];

虚拟机VMWare学习笔记十二 - 将物理机抓取成虚拟机

1. 安装VMware vCenter Converter Standalone Client 运行虚拟机,File -- Virtualize a Physical Machine 这时如果电脑中没有VMware vCenter Converter Standalone Client ,则会进行安装. 安装过程 之后图标会出现在桌面上,双击运行 选择连接到本地服务器,登陆 点击转换计算机 这个,可以将本地计算机抓取成虚拟机,也可以将其他可以访问的计算机(需知道管理员用户名及密码)抓取成虚拟机.

laravel3学习笔记(十二)

原作者博客:ieqi.net ==================================================================================================== 请求反射 HTTP 协议本身是无状态性的,但是在应用中处理各种业务逻辑时我们必须要有状态的把控,这样,折中的办法就是将状态进行标记然后嵌入到 HTTP 协议的请求中,然后应用根据这些标记来进行状态的串联以及处理.所以我们就要对请求进行反射处理以获取请求信息, Lara