如何在函数上传递变量?

时间:2015-09-08 09:18:24

标签: javascript

for (i = 0; i < roles.length; i++) {
    Permission.defineRole(roles[i], function () {
        console.log(roles[i]);
    });
}

变量i未定义。

如何获得那些值?

3 个答案:

答案 0 :(得分:1)

试试这个:

function executeCallback(role) {
    Permission.defineRole(role, function () {
        console.log(role);
    }
}
for (var i = 0; i < roles.length; i++) {

    executeCallback(roles[i]);
}

在执行回调时,i可能已更改(如果回调异步执行)。 正如其他人注意到的那样,你应该添加关键字var(虽然这不会导致未定义)。

答案 1 :(得分:0)

您可以更改回调执行方式的定义吗?您可能希望使用给定的role参数调用回调,以避免这些闭包问题。

Permission.defineRole = function(role, callback){
 //do stuff with your role
 //...

 //when you run the callback, add the role from this closure
 callback(role);
}

然后

for (i = 0; i < roles.length; i++) {
    // pass the roles[i] value to the new function, which creates a new scope for this iteration
    Permission.defineRole(roles[i], function (role) {
        // because role was passed down from the defineRole scope particular to that iteration, role is now the correct one, and different from roles[i].
        console.log(role);
    });
}

也就是说,如果roles[i]未定义,i可能不是0和数组长度之间的值,或者您只是将undefined分配给该键数组。

其他代码也可能同时更改i,因为您没有使用var关键字来声明它(它现在在您的全局窗口对象上)。请use strict模式并使用var声明所有变量,并使用window.name将变量添加到窗口对象。

答案 2 :(得分:-4)

如果您使用strict mode,则必须按关键字var声明变量。

错误的代码:

function d() {
    'use strict';
    asdf = 1;
}

更正代码:

function d1() {
   'use strict';
    var asdf = 1;
}

function d2() {      
    asdf = 1;
}