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 文档而 ...
随机推荐
- uva 10779 Collectors Problem 网络流
链接 一共有n个人, m种收藏品, 每个人拥有的收藏品的种类和个数都是不相同的. 假设2-n这些人都只和1互相交换, 比例是1:1, 并且, 2-n这些人, 只换自己现在没有的, 如果他现在有第二种, ...
- php框架
使用composer构建的php框架 github: https://github.com/Ev2le0/LeoFramework 实现功能: 1)路由 2)ORM 3)视图
- (iOS)Storyboard/xib小技巧
1.选择被view覆盖住的view 当你想直接在view中选择自己想要的元素时,但是又碍于一个view上叠加的元素太多很难直接选中,那么在这时,你同时按住键盘上的shift和 control键,然后在 ...
- android方向键被锁定的问题
当虚拟机启动的时候,很多情况是旁边的方向键不能点击,处于一种被锁定的状态,解决办法如下: 找到 C:\Users\Administrator(你的用户名)\.android\avd\mm.adv( ...
- CCNA实验(6) -- VLAN & SPT
交换机的作用主要有两个:1.维护CAM(ContextAddress Memory)表,该表是MAC地址和交换机端口的映射表2.根据CAM进行数据帧的转发 交换机对数据帧的处理有三种:1.Forwar ...
- Web平台开发流程以及规范
1.js和css的放的位置顺序与加载速度分析 为了让客户先看到效果,必须要先加CSS 如果在先head加载CSS,如果CSS大,会先下载CSS,再渲染HTML标签 如果CSS放在head中,当显示出H ...
- CATransition类动画
- (void)leftClick { [UIView beginAnimations:nil context:nil]; //display mode, slow at beginning and ...
- 物理DG主备库切换时遇到ORA-16139: media recovery required错误
在物理DG主备库切换时遇到ORA-16139: media recovery required错误 SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRI ...
- Mac经常使用快捷键
Mac使用快捷键会节省非常多时间.使用最多的键就是shift键 option键 command键的组合了.当然一下略微用得多一点点,还有非常多快捷键没一一列举了 进入指定文件夹的一些快捷键 进入 A ...
- Android 实现左右滑动效果ViewFlipper终结【转】
本示例演示在Android中实现图片左右滑动效果. 关于滑动效果,在Android中用得比较多,本示例实现的滑动效果是使用ViewFlipper来实现的,当然也可以使用其它的View来实现.接下来 ...