
在 Tiny Slider 中为 indexChanged 等自定义事件绑定回调时,若函数声明位于事件监听器之后,会因变量提升(hoisting)导致 t is not a function 错误;正确做法是先声明函数,再调用 .on() 绑定。
在 tiny slider 中为 `indexchanged` 等自定义事件绑定回调时,若函数声明位于事件监听器之后,会因变量提升(hoisting)导致 `t is not a function` 错误;正确做法是**先声明函数,再调用 `.on()` 绑定**。
Tiny Slider 的事件系统(尤其是 v2.x 版本)依赖于 slider.events.on() 方法注册监听器,而该方法内部会对传入的回调进行类型校验。当使用函数表达式(如 var illuminateSelectedIndex = function(...) {...})定义回调时,该变量不会被提升到作用域顶部——仅变量声明(var illuminateSelectedIndex;)会被提升,但赋值(即函数体)仍保留在原位置。因此,若在函数定义前就执行 slider.events.on('indexChanged', illuminateSelectedIndex),此时 illuminateSelectedIndex 的值为 undefined,Tiny Slider 内部校验失败后抛出压缩后的错误 t is not a function(其中 t 是源码中对回调的简写引用)。
✅ 正确写法:确保回调函数先声明、后绑定:
$(document).ready(function() {
const slider = tns({
container: '.jobs-slider',
items: 5,
autoWidth: true,
slideBy: 'page',
mouseDrag: true,
swipeAngle: false,
loop: true,
speed: 400,
navPosition: 'bottom',
controls: false,
center: true
});
// ✅ 步骤1:先定义回调函数(函数表达式或箭头函数均可)
const illuminateSelectedIndex = function(info) {
console.log('当前索引已变更:', info.index);
console.log('容器ID:', info.container.id);
};
// ✅ 步骤2:再绑定事件(此时 illuminateSelectedIndex 已有有效函数值)
slider.events.on('indexChanged', illuminateSelectedIndex);
});⚠️ 注意事项:
- 避免使用未声明/未初始化的变量作为回调;
- 推荐使用
const声明回调(因其不可重赋值,语义更清晰); - 若需在回调中访问
this或动态上下文,建议显式绑定或使用箭头函数(但注意 Tiny Slider 传参结构固定,通常无需this); - 不要将回调直接内联写在
.on()中(如slider.events.on('indexChanged', function(){...})),虽语法合法,但不利于调试和复用,且仍需确保无作用域问题; - 确保 Tiny Slider 实例
slider已成功初始化(检查控制台是否报tns is not defined或容器选择器无效等前置错误)。
? 补充:Tiny Slider v2.9+ 支持的常用事件包括 'indexChanged'、'transitionStart'、'transitionEnd'、'dragStart' 等,所有事件均需遵循“先定义、后绑定”原则。绑定后,事件将自动在生命周期内持续生效,无需手动清理(除非需解绑,可使用 slider.events.off('indexChanged', handler))。

















