7. javacript高级程序设计- 函数表达式

1. 函数表达式

1.1 函数定义

函数定义的方式有两种:一种是函数声明,另一种就是函数表达式。

(1). 函数声明:函数声明的重要特征就是函数声明提示,函数声明会在函数执行前执行

function functionName(arg0,arg1,arh2){

//函数体

}

(2). 函数表达式

var functionName = function (arg0,arg1,arh2){

//函数体

}

1.2 递归

递归函数是在一个函数通过名字调用自身的情况下构成的,例如:


function factorial(num) {

if (num <= 1) {

return 1;

} else {

return num * factorial(num - 1);

}

}

但是下面的代码出导致出错,


var anotherFactorial = factorial;

factorial = null;

alert(anotherFactorial(4)); //error

arguments.callee是一个指向正在执行的函数的指针,可以利用它来实现对函数的递归调用


function factorial(num) {

if (num <= 1) {

return 1;

} else {

return num * arguments.callee(num - 1);

}

}

在严格模式下,arguments.callee调用会失败,可以使用命名函数表达式来达成相同的结果


var factorial = (function f(num) {

if (num <= 1) {

return 1;

} else {

return num * f(num - 1);

}

})

1.3 闭包

闭包指的有权访问另一个函数作用域中的变量的函数。创建闭包的最常用方式,就是在一个函数内部创建另一个函数。

1.3.1 闭包与变量

闭包只能取得包含函数中任何变量的最后一个值


function createFunctions(){

var result = new Array();

for (var i = 0; i<10;i++) {

result[i] = function(){

return i;

}

};

return result;

}

以上函数每个值取得都是10,为了让函数返回正确的值,可以使用匿名函数强制让闭包的行为符合预期。


function createFunctions() {

var result = new Array();

for (var i = 0; i < 10; i++) {

result[i] = function(num) {

return function() {

return num;

}

}(i);

};

return result;

}

1.3.2 关于this对象

this对象是在运行时基于函数的执行环境绑定的,在全局变量中,this等于window,而当函数在被作为某个对象的方法调用时,this等于那个对象,不过,匿名函数的执行环境具有全局性,因此其this通常指向window。

1.4 模仿块级作用域

javascript中没有块级作用域的概念,匿名函数可以用来模仿块级作用域。

用来模仿块级作用域(通常称为私有作用域)的匿名函数的语法如下所示:


(function(params){

//块级作用域

})(params)

1.5 私有变量

严格来说javascript中没有私有成员的概念,所有的对象属性都是公共的,不过,在任何函数中定义的变量都是私有的,通过在函数中定义变量来实现私有变量。


var obj = function() {

var privateVar = 10;

function privateFunc() {

return false;

}

return {

publicProperty: true.

publicMethod: function() {

privateVar++;

return privateFunc();

}

}

}();

时间: 2024-10-01 07:04:44

7. javacript高级程序设计- 函数表达式的相关文章

JavaScript高级程序设计: 函数表达式

闭包 闭包是指有权访问另一个函数函数作用域中的变量(内部变量)的函数. function createComparsionFunction( propertyName ){ return function( object1 , object2 ){ var value1 = object1[ propertyName ]; var value2 = object2[ propertyName ]; if( value1 < value2 ){ return -1; } else if( valu

Javascript高级程序设计——函数内部属性与函数属性

函数内部属性 函数内部有两个特殊的属性arguments和this.其中,arguments是类数组对象,包含传入函数中的所有值,这个arguments还有一个属性:callee,这个属性是一个指针,指向拥有arguments的函数.而this据以引用的是函数执行环境对象. function fib(n){ if(n = 1){ return 1; }else{ return n * arguments.callee(n - 1); } } //这里利用函数内arguments的callees属

13. javacript高级程序设计-事件

1. 事件 1.1 事件流 事件流描述的是从页面中接受事件的顺序,IE的事件是冒泡流,而Netscape Communicator的事件流是事件捕捉流. 1.1.1 事件冒泡 <!DOCTYPE html> <html> <title>xxx</title> <body> <div id="myDiv">click me</div> </body> </html> 如果你点击了页

8. javacript高级程序设计-BOM

1. BOM 1.1 window BOM的核心对象是window,它表示浏览器的一个实例.在浏览器中,window对象有双重身份, 1.1.1 全局作用域 由于window对象同时扮演着ECMAScript中Global对象的角色,因此所有在全局作用域中声明的变量.函数都会变成window对象的属性和方法. 1.1.2 窗口关系及框架 如果页面中包含框架,则每个框架都拥有自己的window对象,并且保存在frames集合中.在frames集合中,可以通过数值索引(从0开始,从左至右,从上到下)

4. javacript高级程序设计-变量、作用域和内存问题

1.1 基本类型和引用类型的值 变量包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段,引用类型值可以由多个值构成的对象 1.1.1 动态的属性 针对引用对象的值,可以为其动态的添加属性和方法 var person = new Object(); person.name = “chuck”; alert(person.name); // chuck 1.1.2 复制变量值 (1). 基本类型的变量复制 var num = 5; var num2 = num; 复制前:

C语言高级程序设计——函数指针

函数指针指向代码区,普通指针指向数据区.函数指针定义如下: 返回类型 (*函数指针变量)(参数表) 例如,void (*pf)()指向形如void f()这样的函数. 使用函数指针的例子: void open();//对几个函数声明 void print(); void exit(); void (*pfs[])()={open,print,exit};//函数指针数组 int main(){ int i; void (*pf)(); pf=open; (*pf)();//////调用open(

6. javacript高级程序设计-面向对象设计

1. 面向对象设计 1.1 理解对象 1.1.1 属性类型 (1). 数据属性:相当于对象的字段,包含一个数据值的位置,在这个位置可以读取和写入值.数据属性中有4个描述其行为的特性: l [[Configurable]]:表示能否通过delete删除属性从而重新定义属性 l [[Enumerable]]:表示是否通过for-in循环返回属性 l [[Writable]]:表示能否修改属性的值 l [[Value]]:包含这个属性的数据值 要修改属性默认的特性,必须使用ECMAScript5的Ob

3. javacript高级程序设计-基本概念

1.1 语法 ECMAScript借鉴了C和其他类C语言的语法 1.1.1 区分大小写 ECMAScript中的一切(变量,函数和操作符)都是区分大小写的,变量test和Test是不同的变量 1.1.2 标识符 标识符,就是指变量,函数和属性的名字,或者函数的参数.标识符可以是按照以下格式规则组合起来的一或多个字符 (1). 第一个字符必须是一个字母,下划线或者一个美元符号 (2). 其他字符可以是字母.下划线.美元符号或数字 标识符中的字母也可以包含扩展的ASCII或者Unicode字母字符

21. javacript高级程序设计-Ajax与Comet

1. Ajax与Comet 1.1 XMLHttpRequest对象 IE5是第一款引入XHR对象的浏览器,IE5中是通过MSXML库中的一个ActiveX对象实现的.因此在IE中可能存在MSXML2.XMLHttp, MSXML2.XMLHttp.3.0, MSXML2.XMLHttp.6.0,要支持旧浏览器,可以使用如下函数: function createXHR(){ if(typeof XMLHttpRequest != 'undefined'){ return new XMLHttpR