js中 为什么参数传入了return 后 就变成了对象类型?

图片描述

图片描述

var i = 1;
通过闭包传入传参i 后我发现传入后不能作数字用了,通过log打印发现,i被传入后变成了对象(图2)
这是为什么呢?如何解决?求大神指点迷津

补图,完整图 如下
图片描述

通过循环数,传入到最后的闭包中,这个时候打印i 就变成了对象,怎么回事?

阅读 4k
7 个回答
function test(i) {  // 这个 i 是一个形参
    return function(i) {    // 这个 i 是另一个形参
        
    };
}

需要注意的是,形参是种定义,也就是说,这里在两个函数里分别定义了名为 i 的参数,这是两个不同的参数定义。由于定义的就近原则,里面这个函数内部只能访问内部函数参数中定义的 i。看下面的代码

function test(i) {  // 这个 i 是一个形参
    console.log("first", i);
    return function(i) {    // 这个 i 是另一个形参
        console.log("second", i);
    };
}

const f = test(10);    // 这里输出 10
f(20);                 // 这里输出 20

也就是说在内部函数中的 i 实际是由 f(20) 传入的 20。如果想使用外部函数中的参数怎么办?改个名字!改了名字让两个参数名称不一样,那么就不会出现内部函数的参数定义隐藏了外部函数参数定义的问题了。

function test(a) {
    console.log("first", a);
    return function(i) {
        console.log("outer", a);
        console.log("second", i);
    };
}

const f = test(10);
// 输出 first 10
f(20);
// 输出 outer 10
//     second 20

顺便说一下,在注册事件处理函数的时候,这个处理函数是在事件发生时由事件机制调用的,参数并不能由你控制。这里使用闭包,主要目的应该是传一个固定的参数值进去(限制作用域,或代替全局变量),而你遇到的问题在于内部参数定义与外部参数定义同名,所以把外部参数定义隐藏掉了。

建议你把问题代码贴全一点...
return function(i) {}, 其中的 i 和你闭包传入的 i 是没有任何关系的,renturn 以后的参数是作为下一次调用传入的。

function test(i) {
    console.log('i is:' + i);
    return function(i) {
        console.log('i is:' + i);
    }
}
var fun = test(1); // i is:1
fun(2);// i is:2

你这里第一个参数本身就是event没毛病.

$(".box-btn").on("mouseover", function(){
    var index = $(this).index(".box-btn");
    //...
}).on("mouseout", function(){
    var index = $(this).index(".box-btn");
    $(".header_container").addClass("header_container_black_light").removeClass("header_container_" + color_list[index] + "_light");
    $(".footer_container").addClass("header_container_black_light").removeClass("header_container_" + color_list[index] + "_light");
});

clipboard.png

第二个i绑定事件的回掉方法会传一个event对象, 作用域不一样
你要用i就把第二个i改个名字 可以直接用

你把mouseover的i删了就行了

第一个传入的参数是事件对象就是event,你可以在第二个参数传入i

默认event

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题