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 文档而 ...
随机推荐
- java.el.PropertyNotFoundException解决方法
今天在开发中遇到了java.el.PropertyNotFoundException异常,检查JSP页面.Action.Bean.都没有发现错误 在网上搜了一下可能是我的bean不是一个标准的bean ...
- 一句话美化你的下拉框之jQuery.selectMM插件
之前很喜欢 jquery.Dropkick 这个老外美化框插件,但是:IE情况下如果数据多滚动条出现的时候就滚不了,作者也没修复 于是准备自己写一款(确切的说是修改一款吧!!).这款插件是在16素材网 ...
- MFC窗口实现最小化到托盘 右键菜单和还原
//.h文件 void toTray();//最小化到托盘 void DeleteTray();//删除托盘图标 afx_msg LRESULT OnShowTask(WPARAM wParam,LP ...
- pyqt开发教程-搭建环境和开发示例
搭建环境和开发示例 * 安装 安装包 要对应python的版本 32位安装包(我PC上) http://jaist.dl.sourceforge.net/project/pyqt/PyQt4/PyQt ...
- iPhone 5s网络钓鱼邮件,和苹果发布会同步亮相
正如预期的一样,网络犯罪分子会利用Apple最新发表的iPhone 5s消息,几乎在苹果的新产品发表会同时,这个网络钓鱼(Phishing)信件开始流传.此次,趋势科技病毒防治中心 Trend Lab ...
- 预处理指令中#Pragma
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...
- [cpp]伯乐在线编程挑战第 0 期 – 呼叫转移系统
题目: 描述 呼叫转移服务是一个把呼叫号码A转移到号码B的服务.举个例子:当你正在度假时,这样的系统非常有帮助.A君度假去了,那么,A君的工作电话可以通 过呼叫转移至B君.更进一步讲,当B君也正好在度 ...
- distributor之Interrupt Set/Clear-Active Registers, GICD_IS/CACTIVERn
set active寄存器.顾名思义就是把一个中断置为active状态,clear active寄存器就是清除active状态,在这里我们有必要说明一下中断状态的一些概念: active状态:假设此时 ...
- SDWebImage缓存
缓存图片方法 [[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey]; 读取缓存 UIImage *myCache ...
- 【iOS知识学习】_如何判断手机是否为静音模式
目前我涉及的app要获取系统是否为静音模式,到网上搜了一下,千篇一律的都是一样的,而且都是iOS5.0以前才适应的知识,这个大家去搜一下就会很容易发现,找了很久终于找到一个5.0以后适用的,那位大神的 ...