定义函数两种方式:
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. 常用map总结

    Map map = new HashMap(); Iterator it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry e ...

  2. Ajax异步调用http接口后刷新页面

    使用Ajax的目的就是提高页面响应速度,无需同步调用,无需整个页面刷新.这里直接在html中使用js来实现: 先获取XMLHttpRequest对象 var xmlHttp; //创建一个xmlHtt ...

  3. PHP 16 个编程法则

    HP是最好的编程语言.对于PHP开发者来说,掌握一些编程法则是十分重要的.而在PHP中,以双下划线(__)开头的方法称为魔术方法,它们扮演着非常重要的角色. 常用的魔术方法包括: -__constru ...

  4. 详细的nginx.conf中文资料整理

    整理来源: https://blog.csdn.net/tjcyjd/article/details/50695922 整理结果 Nginx的配置文件nginx.conf配置详解如下: #Nginx用 ...

  5. android UI之去掉状态栏

    Android去掉标题栏和全屏都是件很容易的事情,最常见的有两种方法: 第一:在程序代码中实现 Java代码 this.requestWindowFeature(Window.FEATURE_NO_T ...

  6. jenkins使用HTML Publisher Plugin插件 拉取报告样式缺失问题解决

    ---------------------------------------------------------临时解决方案----亲测ok 要解决该问题,方式也比较简单,就是修改Content S ...

  7. fatal: read error: Connection reset by peer解决办法

    标签(空格分隔): ceph源码安装,git 问题描述: 源码安装ceph,克隆代码时提示如下错误: [root@localhost ~]# git clone git://github.com/ce ...

  8. MariaDB 脚本

    研究MariaDB, 需要mock up一些假数据: 生成n个长度整型数的函数rand_num: CREATE DEFINER=`root`@`localhost` FUNCTION `rand_nu ...

  9. 第13章 Spring框架的设计理念与设计模式分析

    13.1 Spring的骨骼架构 最核心的组件是:Core, Context, Bean. 13.1.1 Spring的设计理念 Spring最核心的组件是Bean组件.Spring解决的最关键的问题 ...

  10. Dynamics CRM 2011 FetchXml QueryExpression LINQ

    Dynamics CRM 2011支持三种查询语句 FetchXml QueryExpression LINQ 查询 功能 保存 FetchXml 支持QueryExpression的所有功能,额外支 ...