JavaScript 高级程序设计(第3版)笔记——chapter7:函数表达式
一.函数表达式的语法形式
- 匿名函数
var functionName = function(arg0, arg1, arg2) {
//函数体
}
二.函数表达式没有函数提升
var a = 1;
if(a != 1) {
function sayHi() {
console.log("Hi");
}
} else {
function sayHi() {
console.log("Hello");
}
}
sayHi(); //sayHi() is not defined
var say;
if (a == 1) {
say = function() {
console.log("Hi");
}
} else {
say = function() {
console.log("Hello");
}
}
say(); //Hi
二.使用函数实现递归
function f (num) {
if (num <= 1) {
return 1;
} else {
return num * f(num-1);
}
}
var otherF = f;
f = null;
console.log(otherF(1)); //
console.log(otherF(4)); //error : f is not a function
function f2(num) {
if (num <= 1) {
return 1;
} else {
return num * arguments.callee(num-1);
}
}
var otherF = f2;
f2 = null;
console.log(otherF(1)); //
console.log(otherF(3)); // 6,严格模式下会出错
var f3 = (function ff(num) {
if (num <= 1) {
return 1;
} else {
return num * ff(num - 1);
}
}); //将函数表达式赋值给变量
console.log(f3(1)); //
console.log(f3(3)); // 6,严格模式和非严格模式都可以
三.闭包
- 闭包中外部函数在执行完毕后,其活动对象也不会被销毁,因为闭包中返回的内部函数的作用域链仍然在引用这个活动对象。直到匿名函数被销毁后,外部函数的活动对象才会被销毁。
- 作用域链的这种配置机制引出了一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值。
function createFunction() {
var result = new Array(); for (var i = 0; i < 10; i++) {
result[i] = function() {
return i;
};
} return result;
}
var re = createFunction();
/*
re是一个函数数组,表面上看每个函数都要返回自己的索引值。
但实际上,每个函数都返回10.因为每个函数的作用域中对保存
着createFunction()函数的活动对象,所以它们引用的都是同一个变量i
*/
console.log(re[1]()); //function createFunction() {
var result = new Array(); for (var i = 0; i < 10; i++) {
result[i] = function(num) {
return function() {
return num;
}//函数参数按值传递
}(i);
} return result;
}
var re = createFunction();
console.log(re[1]()); //
四.模仿块级作用域
这种技术通常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。
而通过创建私有作用域,每个开发人员即可以使用自己的变量,又不必担心搞乱全局作用域。
(function () {
var now = new Date();
console.log(now.getMonth());
})();
五.私有变量
1.构造函数模式
function Person(name) {
this.getName = function() {
return name;
};
this.setName = function(value) {
name = value;
}
}
var pserson = new Person("A");
console.log(pserson.getName()); //A
pserson.setName("B");
console.log(pserson.getName()); //B
【有权访问私有变量和私有函数的公有方法称为特权方法。能够在构造函数中定义特权方法,是因为特权方法作为闭包有权访问在构造函数中定义的所有变量和函数。
利用私有和特权成员,可以隐藏那些不应该被直接修改的数据。构造函数模式的缺点是针对每个实例都会创建同样一组新方法。】
2.通过私有作用域
(function() {
var name = "";
Person = function(value) {
name = value;
};
Person.prototype.getName = function() {
return name;
}
Person.prototype.setName = function(value) {
name = value;
}
})();
var p1 = new Person("1");
console.log(p1.getName()); //
p1.setName("2");
console.log(p1.getName()); //
var p2 = new Person("3");
console.log(p1.getName()); //
console.log(p2.getName()); //
【上面的例子中,变量name就变成了一个静态的,由所有实例共享的属性。以这种方式创建静态私有变量会因为使用原型而增加代码复用,但每个实例都没有自己的私有变量。】
六.单例模式
var application = function() {
//私有变量和函数
var components = new Array();
//初始化
components.push(new BaseComponent());
//公共
return {
getComponentCount : function() {
return components.length;
},
registerComponent : function(component) {
if (typeof component == "object") {
components.push(component);
}
}
};
}();
七. 增强的单例模式
【适合那些单例必须是某些类型的实例,同时还必须增加某些属性,方法对其加以增强的情况】
var application = function() {
//私有变量和函数
var components = new Array();
//初始化
components.push(new BaseComponent());
//创建application的一个局部副本
var app = new BaseComponent();
//公共接口
app.getComponentCount = function() {
return components.length;
};
app.registerComponent = function(component) {
if (typeof component == "object") {
components.push(component);
}
};
return app;
}();
JavaScript 高级程序设计(第3版)笔记——chapter7:函数表达式的更多相关文章
- javaScript高级程序设计第3版笔记
<script src = "xxx.js" defer = "defer"> </script> 在引用外部script时,<s ...
- 【读书笔记】读《JavaScript高级程序设计-第2版》 - 非函数部分
章节列表: 第08章:BOM 第09章:客户端检测 第10章:DOM 第11章:DOM2和DOM3 第12章:事件 第13章:表单脚本 第14章:错误处理与调试 第17章:Ajax和JSON第20章: ...
- Javascript高级程序设计第三版-笔记
1.JS数值最大值最小值: >Number.MIN_VALUE <5e-324 >Number.MAX_VALUE <1.7976931348623157e+308 判断数值是 ...
- JavaScript高级程序设计第三版.CHM【带实例】
从驱动全球商业.贸易及管理领域不计其数的复杂应用程序的角度来看,说 JavaScript 已经成为当今世界上最流行的编程语言一点儿都不为过. JavaScript 是一种非常松散的面向对象语言,也是 ...
- JavaScript 高级程序设计 (第4版) 思维导图/脑图 All In One
JavaScript 高级程序设计 (第4版) 思维导图/脑图 All In One JavaScript 高级程序设计 (第4版) 思维导图下载 JavaScript 高级程序设计 (第4版) 脑图 ...
- 《JavaScript高级程序设计》(第二版)
这本书的作者是 Nicholas C.Zakas ,博客地址是 http://www.nczonline.net/ ,大家可以去多关注,雅虎的前端工程师,是YUI的代码贡献者,可想而知这本书得含金量, ...
- 【读书笔记】读《JavaScript高级程序设计-第2版》 - 函数部分
1. 定义 函数实际上是对象,每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定. 对于函数 ...
- 《Javascript高级程序设计第3版》精华总结
一.JavaScript简介 1.1 javascript简史 1.2 javascript实现 + javascript是一种专为网页交互而设计的一种脚本语言,javascript由三大部分组成 ...
- javascript高级程序设计第三版书摘
在HTML 中使用JavaScript <script>元素 在使用<script>元素嵌入 JavaScript 代码时,只须为<script>指定 type 属 ...
- 20.2 解析与序列化【JavaScript高级程序设计第三版】
JSON 之所以流行,拥有与JavaScript 类似的语法并不是全部原因.更重要的一个原因是,可以把JSON 数据结构解析为有用的JavaScript 对象.与XML 数据结构要解析成DOM 文档而 ...
随机推荐
- 本地环境下 WordPress 环境搭建与安装
本地环境:Ubuntu 14.04 使用软件: WordPress 4.1.1 中文优化版 EasyEngine 安装步骤: 安装 LNMP 环境; wget -qO ee rt.cx/ee & ...
- 迭代器(iterators)
1.迭代器的概念 迭代器是一种抽象的设计概念.在设计模式中,迭代器模式定义为:提供一种方法,使之能够依序访问某个容器中所含的各个元素,而又无需暴露该容器的内部组织结构. 迭代器可以看做一种行为类似指针 ...
- 第七届河南省赛G.Code the Tree(拓扑排序+模拟)
G.Code the Tree Time Limit: 2 Sec Memory Limit: 128 MB Submit: 35 Solved: 18 [Submit][Status][Web ...
- H5 应用程序返回button的js代码设计,设计仿stack
history.back(); 该代码具有天然的缺陷,二手知道,于H5应用,尤其是模仿移动应用程序时,,这是不够. 在放大期js为了实现类似特征,请轻喷. 不多说,上代码: /** * Created ...
- ZOJ3689 Digging(01背包)
#include <iostream> #include <cstdio> #include<cmath> #include<algorithm> #i ...
- [Jobdu] 题目1367:二叉搜索树的后序遍历序列
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入: 每个测试案例包括2行: 第一行为1个整数 ...
- jbpmAPI-3
第三章.jBPM安装程序 3.1 .先决条件这个脚本假设您具备Java JDK 1.6 +(设置JAVA_HOME),和Ant 1.7 +安装.如果你没有,请使用以下链接下载并安装:Java:http ...
- jackson的简单实用实例(json)
一个json格式的字符串比如: {"status":10001,"code":"HDkGzI","pubkey":&qu ...
- Could not load type System.ServiceModel.Activation.HttpModule解决办法
等注册完成后网站就可以打开了. win2008下提示未能从程序集“System.ServiceModel, Version=3.0.0.0问题解决 在Windows Server 2008中的IIS服 ...
- bzoj 1196: [HNOI2006]公路修建问题 二分+并查集
题目链接 1196: [HNOI2006]公路修建问题 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1576 Solved: 909[Submit ...