定义函数两种方式:
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. flask之flask-restful

    0.需要的库flask_restful from flask import Flask from flask_cors import CORS 1.参数的获取self.parser.add_argum ...

  2. optimize table tablename

    optimize 优化表OPTIMIZE 命令支持的引擎MyIsam, InnoDB, ARCHVE当对表有大量的增删改操作时,需要用optimize对表进行优化,可以减少空间与提高I/O性能,命令o ...

  3. RHEL6.2配置从零开始

    RHEL6.2最小化安装并配置,持续更新中... 1.RHEL6.2最小化安装 RHEL6.2默认安装许多用不到的软件,不仅浪费空间.增大系统开销,还会显得凌乱.所以选择最小化安装.  注意:安装步骤 ...

  4. (转)Oracle存储过程中的事务

    本文转载自:http://www.cnblogs.com/linjiqin/archive/2011/04/18/2019990.html 1.事务用于确保数据的一致性,由一组相关的DML语句组成,该 ...

  5. 【转】java接口的性能测试

    这周尝试了一把性能测试,之前都是测试网站的性能测试,java接口的性能测试还是头一次,学到了很多,特此分享一下. 主要用到了两个性能测试工具,一个是jmeter,一个是LoadRunner. 使用jm ...

  6. mysql事务之二:MySQL隔离级别演示

    登录mysql: mysql -u root -p123456 Mysql 版本号 mysql> select version(); +-------------------------+ | ...

  7. mysql实战优化之五: 更新/插入优化 sql优化

    通常情况下,当访问某张表的时候,读取者首先必须获取该表的锁,如果有写入操作到达,那么写入者一直等待读取者完成操作(查询开始之后就不能中断,因此允许读取者完成操作).当读取者完成对表的操作的时候,锁就会 ...

  8. AngularJS:过滤器

    ylbtech-AngularJS:过滤器 1.返回顶部 1. AngularJS 过滤器 过滤器可以使用一个管道字符(|)添加到表达式和指令中. AngularJS 过滤器 AngularJS 过滤 ...

  9. Vue.js:教程

    ylbtech-Vue.js:教程 1.返回顶部 1. Vue.js 教程 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架. Vue 只关注视图层, 采用自底向 ...

  10. Fragment的陷阱:概述

    现在主流的APP都会使用到Fragment,相信你也一定使用过,今天为大家介绍一下我曾经踏过的一个关于Fragment的坑. 以前做过的一个项目,Fragment嵌套高德地图,当再次进入Fragmen ...