
本文详解为何 `$("input").eq(0)(":checked")` 会报错“is not a function”,并系统讲解 jquery 对象不可被当作函数调用的本质原因,以及替代方案 `.is()` 和 `.filter()` 的适用场景与差异。
在 jQuery 开发中,一个常见误区是混淆 jQuery 构造函数(即 $ 函数)与其返回值——jQuery 对象之间的关系。$() 是一个函数,它接收选择器字符串、DOM 元素或 HTML 字符串等参数,返回一个封装了匹配元素的 jQuery 对象。但该 jQuery 对象本身不是函数,不能再次被调用(即不具可调用性)。因此,如下写法是非法的:
$("input").eq(0)(":checked"); // ❌ TypeError: jQuery(...) is not a function这里 $("input").eq(0) 返回的是一个仅包含第一个 元素的 jQuery 对象(如 []),而紧随其后的 (":checked") 试图将其当作函数执行,等价于 {length: 1, 0: inputElement, ...}(":checked") —— 这与 ({})("foo") 一样,属于对普通对象的非法调用。
✅ 正确做法取决于你的实际目标:
-
若只需判断该元素是否处于 :checked 状态(返回布尔值),应使用 .is() 方法:
const isFirstChecked = $("input").eq(0).is(":checked"); console.log(isFirstChecked); // true 或 false -
若需获取所有满足 :checked 条件的元素(可能为多个),应在原始集合上使用 .filter():
const allCheckedInputs = $("input").filter(":checked"); console.log(allCheckedInputs.length); // 当前所有已勾选的 input 数量 -
若坚持从单个元素出发并希望仍返回 jQuery 对象(哪怕为空),也可结合 .filter() 使用(注意:.filter() 在单元素集合上调用依然有效):
const firstInput = $("input").eq(0); const maybeChecked = firstInput.filter(":checked"); // 返回 jQuery 对象,长度为 0 或 1
⚠️ 注意事项:
- .is(selector) 性能更优,适用于真值判断;它不创建新集合,仅返回 true/false。
- .filter(selector) 创建新 jQuery 对象,适用于筛选子集,支持链式后续操作(如 .prop("value")、.hide() 等)。
- 避免链式中混用函数调用语法(如 obj("sel"))与方法调用语法(如 obj.method())——jQuery API 统一采用后者。
总结:jQuery 对象是函数调用的结果,而非函数本身。理解这一设计本质,是写出健壮、可维护 jQuery 代码的基础。优先选用语义明确的方法(.is() / .filter()),而非误用括号语法,即可彻底规避此类运行时错误。










