JavaScript快速入门-ECMAScript函数
作者:@skyflask
转载本文请注明出处:https://www.cnblogs.com/skyflask/p/9027347.html
目录
一、函数定义
二、参数
三、返回值
四、函数对象
五、匿名函数
六、作用域
七、闭包
JavaScript函数(定义、参数、返回值、闭包、匿名函数)
一、函数定义
1 2 3 | function functionName(arg0, arg1, ... argN) { statements } |
函数是一组可以随时随地运行的语句。
函数是 ECMAScript 的核心。
函数是由这样的方式进行声明的:关键字 function、函数名、一组参数,以及置于括号中的待执行代码。
二、参数
普通参数:形参
特殊参数:arguments。类似python里面的sys.argv。同样有arguments.lenght,表示参数个数。
1 2 3 4 5 6 7 8 9 | function func1(){ if (arguments[0]== 'test' ){ alert( 'haha' ); } else { alert( 'gaga' ); } } func1( 'test' ); |
三、返回值
除非明确指定返回值(return ***),否则返回值为undefined,同时返回空(return;)也是undefined。
1 2 3 4 5 6 7 | function sayHi(sMessage) { if (sMessage == "bye" ) { return sMessage; #如果参数等于‘bye’,则返回bye。否则返回undefined。 } } var a = sayHi( 'aaa' ); alert(a); |
四、函数对象
在了解匿名函数前,需要了解一下函数对象。
1 | var function_name = new function (arg1, arg2, ..., argN, function_body) |
即函数的另外一种定义方式,通过声明函数的方式进行定义。其实,函数也是一种对象。
上面的函数我们也可以这样定义:
1 | var sayHi = new Function( "sName" , "sMessage" , "alert(\"Hello \" + sName + sMessage);" ); |
注意:前面N个参数,最后面是函数体。这种形式写起来有些困难,但有助于理解函数只不过是一种引用类型,它们的行为与用 Function 类明确创建的函数行为是相同的。
函数对象的属性:
- length
函数对象的方法:
- valueOf() 方法
- toString() 方法
五、匿名函数
我们在python里面学习了lambda函数(匿名函数),比如定义:a=lambda x,y: x+y 调用:print a(1,3).
在JavaScript中基本上类似。
定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //1、 匿名函数-普通定义,无参数 var func = function (){ return ‘aaa’ } alert(func()); //2、 匿名函数直接调用-无参数 ( function (){ alert( "tony" ); } )() //3、匿名函数直接调用-有参数 ( function (arg){ console.log(arg); })( '123' ) |
六、作用域
作用域(基础知识)
在学习闭包之前,我们需要先了解JavaScript的作用域。几乎所有的编程语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。
作用域五句话原则:
1、JavaScript中无块级作用域
1 2 3 4 5 6 7 | function Main(){ if (1==1){ var name = 'test' ; } console.log(name); } // 输出: test。在函数内查找。 |
2、JavaScript采用函数作用域
在JavaScript中每个函数作为一个作用域,在外部无法访问内部作用域中的变量。
1 2 3 4 5 6 7 8 9 | function Main(){ var innerValue = 'test' ; } Main(); console.log(innerValue); #作用域在函数内,函数外没定义,无法找到。 // 报错:Uncaught ReferenceError: innerValue is not defined |
3、JavaScript的作用域链
由于JavaScript中的每个函数作为一个作用域,如果出现函数嵌套函数,则就会出现作用域链。
1 2 3 4 5 6 7 8 9 10 11 | xo = 'xxoo' ; //全局变量,global function Func(){ var xo = "ooxx" ; //函数内的局部变量,exeternal function inner(){ var xo = 'xxxx' ; //函数内的局部变量,local console.log(xo); } inner(); } Func(); |
如上述代码则出现三个作用域组成的作用域链,如果出现作用域链后,那么寻找变量时候就会出现顺序,对于上述实例:
当执行console.log(xo)时,其寻找顺序为根据作用域链从内到外的优先级寻找,如果内层没有就逐步向上找,直到没找到抛出异常。
类似Python中的LEGB原则,首先会在local(本地)查找=>然后会到external(外部)查找=>再会查找global(全局)查找=>最后到build-in(内建)查找。进行链式查找!
4、JavaScript的作用域链执行前已创建
JavaScript的作用域在被执行之前已经创建,日后再去执行时只需要按照作用域链去寻找即可。
由于JavaScript是先加载完,再调用。当所有命名空间加载完成后,最后去查找,所以作用域链在执行前就已经创建好了。
5、JavaScript声明提前
在JavaScript中如果不创建变量,直接去使用,则报错:
1 2 | console.log(xxoo); // 报错:Uncaught ReferenceError: xxoo is not defined |
1 2 3 4 5 6 7 | function Foo(){ console.log(xo); var xo = 'xxoo' ; } Foo(); // 输出:undefined |
上述代码,不报错而是输出 undefined,其原因是:JavaScript的函数在被执行之前,会将其中的变量全部声明,而不赋值。所以,相当于上述实例中,函数在“预编译”时,已经执行了var xo;所以上述代码中输出的是undefined。
七、闭包
作用域搞清楚后,理解闭包就非常简单了。
1 2 3 4 5 6 7 8 9 10 11 12 | var city = 'beijing' ; function func(){ var city = "shanghai" ; function inner(){ // var city = "langfang"; console.log(city); } return inner; } var ret = func(); ret(); #shanghai |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」