定义函数两种方式:
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常用命令(个人使用频率较高)

    1,日志查看 tail(cat) -f|grep ERROR(任意字符) filepath (任意行数) -f|grep ERROR(任意字符) filepath 2,查看目录&授权 file ...

  2. Oracle 数据库备份还原(Expdp/impdp)记录

    最近公司将原数据库服务器切换.之前没整过这块,也是一堆的度娘.经过不停的摸索,终于成功了.现在将这份艰辛记录下来,方便自己以后查阅的同时,方便有类似需求的同学参考. 我们此次切换共分:ERP.LOS. ...

  3. Winform判断是否已启动

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  4. 分布式缓存系统 Memcached 内存管理机制

    在前面slab数据存储部分分析了Memecached中记录数据的具体存储机制,从中可以看到所采用的内存管理机制——slab内存管理,这也正是linux所采用的内存高效管理机制,对于Memchached ...

  5. Linux - 用户的增删改查及组的相关操作

    useradd:新增一个用户 useradd 几个常用的参数: -u:指定用户的 uid -g:指定用户所属的组 -d:指定用户的家目录 -c:指定用户的备注信息 -s:指定用户所用的 shell [ ...

  6. transfrom-runtime文档

    transfrom-runtime文档 babel只会默认对句法进行转换,而那些方法,api不会转换,要转就要使用polyfill和transform,这里介绍transform,关于polyfill ...

  7. new Com

    CreateOleObject System.Win.ComObj.hpp #include <objbase.h>     Winapi.ActiveX.pas   CoInitiali ...

  8. EditText中onEditorAction监听事件执行两次

    Android的EditText通过setOnEditorActionListener给文本编辑框设置监听事件,但是在其处理方法onEditorAction中的逻辑在每次回车后都触发了两次, 原来是在 ...

  9. 201671010140. 2016-2017-2 《Java程序设计》java学习第三周

    java学习第三周       不知不觉,学习java已经是第三周了,不同于初见时的无措,慌张,在接触一段时日后,渐渐熟悉了一些,了解到了它的便利之处,也体会到了它的一些难点,本周主攻第四章,< ...

  10. Java对象的强、软、弱和虚引用

    本文介绍Java对象的强.软.弱和虚引用的概念.应用及其在UML中的表示. 1.Java对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象 ...