for (i = 0; i < roles.length; i++) {
Permission.defineRole(roles[i], function () {
console.log(roles[i]);
});
}
变量i未定义。
如何获得那些值?
答案 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;
}