定义函数两种方式:
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. 关于IO流的抽象类

    被一个问题问愣了:java的IO里有哪些抽象类?这个一时半会儿还真记不得,只知道IO有好几类,具体有哪些抽象类从来没有去认真记过.回头仔细看了下分类和继承才发现其实就两对:字节流的抽象类是InputS ...

  2. JVM知识整理和学习(转载并修改)

    JVM是虚拟机,也是一种规范,他遵循着冯·诺依曼体系结构的设计原理. 冯·诺依曼体系结构中,指出计算机处理的数据和指令都是二进制数,采用存储程序方式不加区分的存储在同一个存储器里,并且顺序执行,指令由 ...

  3. 蓝桥杯 算法训练 ALGO-57 删除多余括号

    算法训练 删除多余括号   时间限制:1.0s   内存限制:512.0MB 问题描述 从键盘输入一个含有括号的四则运算表达式,要求去掉可能含有的多余的括号,结果要保持原表达式中变量和运算符的相对位置 ...

  4. java 随意控制控件的位置

    package chat1; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class chat1{ ...

  5. unittest之跳过用例(skip) (含如何调用类里面函数相互调取变量的方法)

    当测试用例写完后,有些模块有改动时候,会影响到部分用例的执行,这个时候我们希望暂时跳过这些用例. 或者前面某个功能运行失败了,后面的几个用例是依赖于这个功能的用例,如果第一步就失败了,后面的用例也就没 ...

  6. 银行排队问题之单队列多窗口加VIP服务(30 分)

    银行排队问题之单队列多窗口加VIP服务(30 分) 假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口可选 ...

  7. 1097 Deduplication on a Linked List

    题意: 给出一个链表,删除绝对值相同的结点,对于每个绝对值为K的结点,只保留第一次出现的那个.把被移除的结点组成一个新链表,输出删除去重后的链表和新链表. 思路:考察链表的“删除”操作,不难. 代码: ...

  8. 使用原生js创建自定义标签

    使用原生js创建自定义标签 效果图 代码 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  9. Django项目部署-01

    1. 安装Python 下载链接:https://www.python.org/getit/ 我这边下载的是3.6.5的版本的执行版本,安装过程中选择自动安装pip 2.安装django pip in ...

  10. 音频AAC编码浅析

    /* * unsigned long nSampleRate, // 采样率,单位是bps * unsigned long nChannels, // 声道,1为单声道,2为双声道 * unsigne ...