JavaScript 函数定义、调用方式与注意事项详解
本文详细解析JavaScript中函数的两种定义方式:函数声明与函数表达式,重点阐述函数命名规范、返回值机制及嵌套函数的作用域限制。深入探讨函数作为普通函数、方法、构造函数及间接调用(call/apply)四种调用场景下的this指向差异,特别是严格模式与非严格模式对调用上下文的影响,以及构造函数中new关键字的行为逻辑。
JavaScript 函数定义基础
函数定义
函数声明方式
function(a,b){
return a+b;
}
表达式定义方式
var add = function(a,b){return a+b};
//函数表达式可以包含名称,这在递归时很有用 var f = function fact(x){ if(x<=1) {return 1; }else { return x*fact(x-1); } }
以表达式方式定义的函数,其名称是可选的。若函数定义表达式中包含了名称,该名称将作为局部变量绑定到函数内部的局部作用域中,即函数的名称实际上成为了函数内部的一个局部变量。
函数命名规范
1. like_this():首字符为小写,若包含多个单词,单词之间以下划线分隔。
2. likeThis():首字符为小写,若包含多个单词,除第一个单词外,其余单词的首字母使用大写字母(驼峰命名法)。
3. 内部函数或私有函数,通常以一条下划线为前缀。
注意:函数声明语句会被提升到外部脚本或外部函数作用域的顶部,因此可以在其定义之前被代码调用。
以表达式方式定义的函数,必须先将其赋值给一个变量。因此,在定义之前无法调用该表达式方式定义的函数。
函数返回值
- return语句用于将函数的值返回给调用者。
- 若函数中没有return语句,则默认返回undefined。
函数返回值与嵌套函数
嵌套函数
- 嵌套函数可以访问其外层函数的参数和变量。
- 但是,嵌套函数不能出现在循环、条件判断,或者try/catch/finally/with语句中。
函数的四种调用方式
函数调用
- 作为函数调用
- 作为方法调用
- 作为构造函数调用
- 通过它们的call()和apply()方法间接调用
作为普通函数调用
作为函数调用
add(1,2)
根据ECMAScript3和非严格模式下的ECMAScript5规定,函数调用的上下文(即this的值)是全局对象。然而在严格模式下,调用上下文则是undefined。
//定义一个函数且调用一个函数来确定当前脚本运行是否为严格模式
var strict = (function(){return this;}());
作为方法调用与this指向
作为方法调用
var o = {
m:1,
n:2,
add:function(){
this.result = this.m+this.n;
}
}
方法调用与函数调用的一个重大区别在于调用上下文。
o.add()中,add的调用上下文为o,即this。o.add()等同于o['add']()。当方法不需要返回值时,最好直接返回this以实现方法链。this是一个关键字,不是变量,也不是属性名。JavaScript语法不允许给this赋值。与变量不同,关键字this没有作用域的限制,嵌套的函数不会从调用它的函数中继承this。如果想访问外部函数的this,需将this保存在变量中(如var self = this)。如果嵌套函数作为函数调用,其this的值指向调用它的对象。如果作为普通函数调用,this在非严格模式下不是全局对象,就是在严格模式下为undefined。
作为构造函数调用
构造函数调用
var o = new Object();
构造函数调用与普通函数调用以及方法调用在实参处理、调用上下文和返回值等方面都有不同。
凡是没有形参的构造函数调用都可以省略圆括号。
var o = new Object();
var o = new Object;
//等价
构造函数调用创建一个新的空对象,该对象继承自构造函数的prototype属性。构造函数试图初始化这个新创建的对象,并将其作为上下文,因此构造函数可以使用this关键字来引用这个新创建的对象。
new o.m()调用的上下文并不是o。构造函数并不使用return。如果构造函数显式地使用return语句返回一个对象,那么调用表达式的值就是这个对象。如果构造函数没有返回值,或者返回一个原始值,那么就会忽略返回值,同时使用新对象作为返回结果。
间接调用:call与apply
间接调用
call() apply()
JavaScript异步发送HTTP请求时怎么优雅地处理错误
2026-11-05 17:10:44
5款主流JS在线运行工具对比:CodePen、JSFiddle与StackBlitz怎么选
2026-11-05 17:04:04
JavaScript入门书籍避坑:这些书不适合初学者
2026-11-05 16:31:15
JS使用Math.round实现保留两位小数的原理与代码
2026-11-05 15:35:55
JavaScript 原生 Date 对象怎么实现日期加减
2026-11-05 14:30:00
