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(); } } }(); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构