JavaScript学习笔记(八)--- 函数表达式

1.递归

实现一:

function factorial(num){
    if(num<=1){
        return 1;
    }else{
        return num*factorial(num-1);
    }
}
alert(factorial(4)); //24

但给factorial重赋值时,再调用就会出错。

var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4)); //TypeError: factorial is not a function

实现二:

使用arguments.callee解决上面问题。

function factorial(num){
    if(num<=1){
        return 1;
    }else{
        return num*arguments.callee(num-1);
    }
}
alert(factorial(4)); //24

修改factorial,再调用

var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4)); //24

实现三:

在严格模式下,不能通过脚本访问arguments.callee。解决办法,使用命名函数表达式。

var factorial = (function f(num){
    if(num<=1){
        return 1;
    }else{
        return num*f(num-1);
    }
});

alert(factorial(4)); //24

以上代码创建了一个名为f()的命名函数表达式,然后将它赋值给变量factorial。

把函数赋值给另一个变量,函数的名字f仍然有效。这种方式在严格模式和非严格模式下都行得通。

var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4)); //24

2.闭包

时间: 2024-10-10 22:21:08

JavaScript学习笔记(八)--- 函数表达式的相关文章

JavaScript高级程序设计7学习笔记之函数表达式

函数表达式是JavaScript中的一个既强大有容易令人困惑的特性 定义函数的方式有两种,一种是函数声明,另一种就是函数表达式 关于函数声明,它的一个重要特征就是函数声明提升,意思是在执行代码前会读取函数声明,这就意味着可以把函数声明放在调用它的语句后面 sayHi(); function sayHi(){alert("hi");} 第二种创建函数的方式是使用函数表达式,函数表达式有几种不同的语法形式 最常见的一种方式是 var functionName = function(arg0

JS学习笔记3_函数表达式

1.函数表达式与函数声明的区别 函数声明有“提升”(hoisting)的特性,而函数表达式没有.也就是说,函数声明会在加载代码时被预先加载到context中,而函数表达式只有在执行表达式语句时才会被加载 2.闭包 有权访问另一个函数作用域中的变量的函数.闭包可以访问另一个作用域中的变量,因此闭包得到的变量值是最终值,而不是该变量在某一时刻的值,有一个很经典的例子: function createFuns(){ var result = new Array(); for(var i = 0;i <

Javascript学习笔记(函数---再次学习)

1.函数的定义 2.函数的递归调用 3.闭包 1.函数的定义有两种: 第一种:函数声明 function functionName(arg0,arg1,arg2){ //函数体 } 函数声明,一个重要特征是函数声明提升,即在执行代码之前会先读取函数声明. 第二种:使用函数表达式 var functionName = function(arg0,arg1,arg2){ //函数体 }; 函数表达式与其他表达式一样,在使用前必须先赋值. 两种创建方式的区别:函数声明的方式创建函数会使函数声明提升.

【ECMAScript】es5学习笔记1——函数表达式

一.es5中函数定义的两种形式: 1.函数声明 function a() { //here is you code } 2.函数表达式 var a = function() { //here is your code } 首先要明确的一点是,在es5中,函数是一种对象(object),或者说,函数是Object类的子类 a instanceof Function //true a instanceof Object //true 函数声明有一个非常重要的特征,函数声明提升,意思是,在执行代码之前

JavaScript学习笔记八

本文根据慕课网课程<JavaScript进阶>学习整理 第8章 浏览器对象 8-1 window对象 ??window对象是BOM的核心,window对象指当前的浏览器窗口. ??window对象方法: ?? 8-2 JavaScript 计时器 ??在JavaScript中,我们可以在设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行. ??计时器类型: 一次性计时器:仅在指定的延迟时间之后触发一次. 间隔性触发计时器:每隔一定的时间间隔就触发一次. ??计时器方法: ?? 8-3

JavaScript学习笔记——运算符和表达式

javascript运算符 一.运算符和操作数的组合就称为表达式. 二.javascript运算符 (一) 算术运算符 + - * / % var++ ++var var-- --var A. + (1) 用于数值的运算 (2) 用于字符串的连接 *************************** 任何的数据类型和字符串相加都是等于相加以后的字符串 ************************* B. % (1)用于取余数,判断奇数或者是偶数 (2)一般不用于小数,因为结果不确定. C.

javascript学习笔记--迭代函数

概要 这里的迭代函数指的是对数组对象的操作方法,js数组共有五个迭代函数:every.fifter.forEach.map.some. 1.every every方法,返回值为Boolean类型,true表示数组中所有元素都满足条件,false表示数组中至少有一个不满足条件,代码如下: 1 var numbers = [1,2,3,4,5,4,3,2,1]; 2 numbers.every(function(item,index,array){ return item > 2; }) 3 输出:

javascript学习笔记(八)

3.求出数组中所有数字的和 一. 实现页面样式 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <title>求出数组中所有数字的和</title> <style> body{ color:#999; font:12px/1.5 Tah

JavaScript学习笔记——2.函数

1.定义 函数是一个完成“指定功能”且“命名”的代码段 函数只有通过名称“调用” 2.基本格式 function test(形参){ ... return 值; //停止执行 } test(实参); test()有括号为调用,在任何位置都可调用,包括自身(递归) test不加括号为函数自身,可当做变量使用 所以: var test=function(形参){ ... } test(实参); 3.参数处理 “有形无实”的处理: function test(a,b){ a = a?a:1; //未定

JavaScript学习笔记八:面向对象的程序设计

1. ECMA-262把对象定义为:无序属性的集合,其属性可以包含基本值,对象和函数.每个对象都是基于一个引用类型创建的. 2. 属性有两种:数据属性和访问器属性,其中访问器属性不能直接定义,必须使用Object.defineProperty()来定义. 3. 任何函数,只要通过new操作符来调用,那它就可以作为构造函数. 4. 原型:无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象. 这个连接存在于实例与构造函数的原型