javascript中函数是具有对象特性和可调用能力的一等公民:可赋值、传参、返回、动态创建,拥有name、length等属性及tostring()方法,typeof检测为'function'。

JavaScript 中函数确实是特殊的数据类型——它既是对象,又可以被调用。这种“一等公民”(first-class)地位让函数能像字符串、数字一样被赋值、传参、返回,甚至动态创建。
函数是对象,拥有属性和方法
虽然函数用来执行逻辑,但它底层是 Function 构造函数的实例,因此具备对象特性:
- 可以添加自定义属性:
myFunc.count = 0; - 可访问内置属性如
name(函数名)、length(形参个数)、prototype(用于构造函数) - 可通过
toString()查看源码字符串:function a(){} .toString()返回"function a(){}"
函数可以被赋值、存储和传递
这是“当作数据处理”的核心体现:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 赋值给变量:
const fn = function() { return 'hello'; }; - 作为数组元素:
const tasks = [fn1, fn2, () => console.log('done')]; - 作为对象属性:
const obj = { run: function() {}, delay: setTimeout }; - 作为参数传入其他函数(回调):
[1,2,3].map(x => x * 2)中的箭头函数就是被传入的数据
函数可以动态创建和执行
利用 Function 构造函数或 eval(不推荐),能在运行时生成函数:
-
const calc = new Function('a', 'b', 'return a + b');—— 参数名和函数体均为字符串 -
setTimeout、setInterval的第一个参数也接受字符串(会隐式调用Function,存在安全与性能问题,应避免) - 闭包让函数携带其词法环境,使“数据+行为”封装更自然,例如:
const makeCounter = () => { let count = 0; return () => ++count; };
函数有独立的类型检测方式
用 typeof 判断最直接:typeof function(){} === 'function'。注意:typeof null 是 'object',但 typeof [] 也是 'object',所以判断函数不能只靠 typeof x === 'object'。更严谨可用:
Object.prototype.toString.call(fn) === '[object Function]'-
fn instanceof Function(在跨 iframe 场景可能失效) - 现代写法:
typeof fn === 'function'已足够可靠(ECMAScript 规范保证)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










