定义函数两种方式:
1.函数声明
function sayHi(){
alert("Hi");
}
sayHi();//调用函数
2.函数表达式
var sayHi = function(){
alert("Hi");
}
sayHi();//调用函数
函数声明提升(function declaration hoisting):在执行代码之前会先读取函数声明。
sayHi();
function sayHi(){//函数声明可以放到调用它的语句后面
alert("Hi");
}
sayHi();//函数表达式则不行,会报错,找不到这个函数
var sayHi = function(){
alert("Hi");
}
 
递归
 
function factorial2(num){
if (num <= 1) {
return 1;
} else {
return num * factorial2(num - 1);//为了消除紧耦合,使用arguments.callee
}
}
var f2 = factorial2;
factorial2 = null;
// console.log("factorial2(5): "+factorial2(5));
console.log("f2: "+f2(5));//使用arguments.callee就不会报错
factorial2()函数保存在变量f2中,然后将factorial2变量设置为null,结果指向原始函数的引用只剩下一个。接下来调用f()时,由于必须执行factorial2(),而factorial2已经不再是函数,所以会报错。可以使用arguments.callee解决这个问题。
function factorial2(num){
if (num <= 1) {
return 1;
} else {
return num * arguments.callee(num - 1);//为了消除紧耦合,使用arguments.callee
}
}
var f2 = factorial2;
factorial2 = null;
// console.log("factorial2(5): "+factorial2(5));
console.log("f2: "+f2(5));//使用arguments.callee就不会报错
 
闭包
指有权访问另一个函数作用域中的变量的函数。创建闭包的常用方式,就是在一个函数内部创建另一个函数。
 
 
闭包与变量
由于作用域链的机制,闭包只能取得包含函数中任何变量的最后一个值。
闭包保存的是整个变量对象,而不是某个特殊的对象。
//闭包与变量
function createFunctions() {
var result = new Array();
for (var i = 0; i < 10; i++) {
result[i] = function () {
return i;
}
}
return result;
}
 
function createFunctions() {
var result = new Array();
for (var i = 0; i < 10; i++) {
result[i] = function (num) {
return function(){
return num;
};
}(i);
}
return result;
}
 
this对象
this对象的绑定取决于运行时函数的执行环境:全局函数中,this等于window,而函数被作为某个对象的方法调用时,this等于那个对象。
var name = "Hello World";
var object = {
name: "HaHa",
getNameFunc: function(){
return function(){//返回匿名函数
return this.name;
}
}
}
console.log(object.getNameFunc()());//"Hello World" 非严格模式下 输出的是全局对象
 
var name2 = "Hello World";
var object2 = {
name2: "HaHa",
getNameFunc: function(){
var that = this;
return function(){//返回匿名函数
return that.name2;
}
}
}
console.log(object2.getNameFunc()());//"HaHa" 输出的是this对象
 
var name3 = "Hello World";
var object3 = {
name3: "Haha",
getName: function(){
return this.name3;
}
}
console.log("object3.getName(): "+object3.getName());//HaHa
console.log((object3.getName)());//HaHa
console.log((object3.getName = object3.getName)());//Hello World
 
 
 
 
 

javascript高级程序设计读书笔记----函数表达式的更多相关文章

  1. JavaScript高级程序设计学习笔记--函数表达式

    关于函数声明,它的一个重要特征就是函数声明提升,意思是在执行代码之间会读取函数声明,意思是在执行代码之前会先读取函数声明.这就意味着可以把函数声明放在调用它的语句 后面. sayHi(); funct ...

  2. javascript高级程序设计读书笔记

    第2章  在html中使用javascript 一般都会把js引用文件放在</body>前面,而不是放在<head>里, 目的是最后读取js文件以提高网页载入速度. 引用js文 ...

  3. JavaScript高级程序设计 读书笔记

    第一章 JavaScript 简介 第二章 Html中使用JavaScript 第三章 基本概念 第四章 变量,作用域,内存 第五章 引用类型 第六章 面向对象 第七章 函数表达式 第八章 BOM 第 ...

  4. JavaScript高级程序设计-读书笔记(2)

    第6章 面向对象的程序设计 创建对象 1.最简单方式创建Object的实例,如 var person = new Object(); person.name = “Greg”; person.age ...

  5. JavaScript高级程序设计-读书笔记(1)

    第1章 JavaScript简介 JavaScript是一种专为与网页交互而设计的脚本语言,由下列三个不同的部分组成: l        ECMAScript:提供核心语言功能: l        文 ...

  6. javascript高级程序设计读书笔记----引用类型

        Array类型. ECMAScript数组的每一项可以保存任何类型的数据. 数组大小是可以动态调整的. 创建数组第一种基本方式方式: 使用Array构造函数 var colors = new ...

  7. javascript高级程序设计读书笔记-事件(一)

    读书笔记,写的很乱   事件处理程序   事件处理程序分为三种: 1.html事件2. DOM0级,3,DOM2级别  没有DOM1 同样的事件 DOM0会顶掉html事件   因为他们都是属性  而 ...

  8. JavaScript高级程序设计-读书笔记(7)

    第22章 高级技巧 1.高级函数 (1)安全的类型检测 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串. ...

  9. Javascript高级程序设计读书笔记(第六章)

    第6章  面向对象的程序设计 6.2 创建对象 创建某个类的实例,必须使用new操作符调用构造函数会经历以下四个步骤: 创建一个新对象: 将构造函数的作用域赋给新对象: 执行构造函数中的代码: 返回新 ...

随机推荐

  1. Linux环境抓包命令

    有时候有些接口调用问题不好定位或者日志不够详细,那么我们往往会选择通过抓包来看详细的通讯过程.抓包有相关软件,这里说如何直接在环境里抓.假如现在我们在 Linux 下部署了 Tomcat 服务器,端口 ...

  2. 【转】使用JMeter 完成常用的压力测试(三)

    使用JMeter 完成常用的压力测试 发布时间: 2008-9-27 15:33    作者: 未知    来源: 网络转载 字体:  小  中  大  | 上一篇 下一篇 | 打印  | 我要投稿 ...

  3. Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类

    一.前提回忆: 1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均 ...

  4. 从excel、txt、dict中取data,预期值

    一:从excel中取data excel中放入预期值,上报data数据 excel中第一行是data数据,第二行是预期值 在每个class中,取data数据上报到接口中,具体代码如下: def get ...

  5. CDM中,创建一个或多个组合属性的唯一约束

    除主键外,有时还需要创建一个或多个组合字段的唯一约束,方法如下: 双击打开实体,在idntifier标签页中可看到默认主键的唯一约束,在其下方添加一条记录,然后双击该记录,打开约束设置窗口 在该窗口的 ...

  6. dubbo学习 一 dubbo概述

    1,背景     1,网站刚开时候的时候可能所有的功能业务都在一个应用里面 2,当业务不断复杂,流量不断增多的时候,就需要将原先的一个应用划分成多个独立的应用. 3,当分出来的业务越来越多的时候,应用 ...

  7. jetbrains idea/webstorm等(注册,激活,破解码,一起支持正版,最新可用)(2017.3.16更新)【转】

    选择 License server (2017.3.16更新) http://idea.imsxm.com/ 详细请参考:  http://www.cnblogs.com/ys-wuhan/p/584 ...

  8. GBK/ UTF-8/ UNICODE(字符编码)

    在python2中:如果执行程序,在编译器中,因为默认的编码是ASCII码(英文),所以如果输入中文就会出现乱码,因此为了避免这种乱码的情况发生,在输入中文字符串之后,必须进行手动转码,将GBK/ U ...

  9. Init & Deinit & ARC

    [Init & Deinit] 1.switf中,init不返回值,只负责初始化成员变量.在init方法中可以初始化常量. 2.默认初始化. 3.Swift provides an autom ...

  10. Sprite Editor

    [Sprite Editor] 在Unity3D中,一个图片可以有多种类型(如下图).对于2D游戏开发,最常用的类型就是Sprite. 下图是Sprite Texture的属性,Packing Tag ...