本文深入解析JavaScript中函数的核心概念,对比命名函数与匿名函数的定义方式、调用时机及作用域差异。重点剖析return语句后换行导致的自动插入分号引发的返回值错误,并阐述函数作为一等公民的对象特性、嵌套定义及闭包机制,帮助开发者规避常见编码陷阱。
JavaScript函数的核心特性
JavaScript函数
核心要点包括:
a).函数在JavaScript中属于一等公民(具备高重要性) b).函数本质上是一个对象 c).函数定义会创建一个独立的变量作用域
函数的定义方式与调用差异
定义方法分类
a)命名函数定义:
若未在其它函数内部进行定义,则命名函数默认处于全局作用域。
// 全局的命名函数
function add(x, y) {
return x + y;
}
console.info(add(100, 200)); //300
b)匿名函数定义:
匿名函数通常被赋值给变量,随后通过该变量进行调用。
var func = function (x, y) {
return x + y;
}
console.info(func(5, 2)); //7
匿名函数常见于“立即执行函数表达式(IIFE)”场景:
console.info(
function (x, y) {
return x + y;
}(100, 200) //立即调用
);
C)定义方式对代码执行逻辑的影响
命名函数支持先调用后定义(提升机制)。
console.info(sum(10, 10));
function sum(num1, num2) {
return num1 + num2;
}
匿名函数必须严格遵循先定义后调用的顺序。
//console.info(sumFunc(10, 10)); //Uncaught TypeError: Property 'sumFunc' of object [object Object] is not a function
var sumFunc = function (num1, num2) {
return num1 + num2;
};
console.info(sumFunc(10, 10));
函数返回值与自动分号陷阱
函数返回值机制:
通过return语句生成返回值;若缺失return语句,函数默认返回undefined。
function func() {
}
console.info(func()); //undefined
function func2() {
return; //空的返回语句
}
console.info(func2()); //undefined
return语句中存在的潜在陷阱:
var func = function (x, y) {
var sum = x + y;
return {
value : sum
}
}
此种写法运行正常:调用 func(5,5) 返回 Object {value: 10}
然而:
var func = function (x, y) {
var sum = x + y;
return
{
value: sum
};
}
console.info(func(5,5)); //undefined
若return语句后紧跟回车换行符, 调用 func(5,5) 的结果将显示为 undefined 编辑器自动在return后插入分号;,但在此特定情境下无效。
函数作为对象的高级应用
函数即对象特性:
function add(x, y) {
return x + y;
}
console.info(add(100, 200)); //300
var other = add; //other和add引用同一函数对象
console.info(other(300, 400)); //700
console.info(typeof other); //function
console.info(add === other); //true
嵌套定义的函数:
在函数内部允许定义另一个函数。
function outerFunc(a, b) {
function innerFunc(x) {
return x * x;
}
return Math.sqrt(innerFunc(a) + innerFunc(b));
}
console.info(outerFunc(3, 4)); //5
外部变量访问:
内部函数具备访问外部变量与参数的能力。
var globalStr = 'globalStr';
function outerFunc2(argu) {
var localVar = 100;
function innerFunc2() {
localVar++;
console.info(argu + ":" + localVar + ":" + globalStr);
}
innerFunc2(); //hello:101:globalStr
}
outerFunc2("hello");
返回函数的函数:
鉴于函数是对象,因此可作为返回值使用。
function outerFunc(x) {
var y = 100;
return function innerFunc() {
console.info(x + y);
}
}
outerFunc(10)(); //110
上述内容构成了本文的全部要点,期望读者能够受益。