Javascript 如何在函数上传递变量? for(i=0;i
变量i未定义 如何获取这些值?尝试以下方法:Javascript 如何在函数上传递变量? for(i=0;i,javascript,Javascript,变量i未定义 如何获取这些值?尝试以下方法: for (i = 0; i < roles.length; i++) { Permission.defineRole(roles[i], function () { console.log(roles[i]); }); } 函数executeCallback(角色){ 权限.defineRole(角色、功能(){ console.log(角色); } } 对于(变量i=0;i
for (i = 0; i < roles.length; i++) {
Permission.defineRole(roles[i], function () {
console.log(roles[i]);
});
}
函数executeCallback(角色){
权限.defineRole(角色、功能(){
console.log(角色);
}
}
对于(变量i=0;i
在执行回调时,i
可能已更改(如果回调异步执行)。
正如其他人所注意到的,您应该添加关键字var(尽管这不会导致未定义)。如果使用
严格模式
,则必须按关键字var
声明变量
错误代码:
function executeCallback(role) {
Permission.defineRole(role, function () {
console.log(role);
}
}
for (var i = 0; i < roles.length; i++) {
executeCallback(roles[i]);
}
正确代码:
function d() {
'use strict';
asdf = 1;
}
您能否更改回调执行方式的定义?您可能希望使用给定的角色参数调用回调,以避免这些闭包问题
function d1() {
'use strict';
var asdf = 1;
}
function d2() {
asdf = 1;
}
然后
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[i]
从未定义过,i
可能不是介于0和数组长度之间的值,或者您只是将undefined
分配给数组中的该键
其他代码也可能同时在更改
i
,因为您没有使用var
关键字来声明它(它现在位于全局窗口对象上)。请使用strict
模式,并使用var声明所有变量,使用window.name向窗口对象添加变量。使用是否确定未定义的是i
变量而不是角色[i]
?该代码段中肯定没有未定义i
的可能重复项-如果匿名函数是异步回调,则会出现其他问题,例如console.log语句中的i是roles.length,因此roles[i]
根据定义保证是未定义的…但是i
不是未定义的变量代码甚至不会运行(它应该在解析器中抛出一个错误)如果您没有在严格模式下声明变量。@WardD.S.我试图将第一个函数执行到控制台中,没有问题。但是如果执行该函数,控制台显示错误asdf未定义。Mh我抛出解析错误是错误的,但如果您尝试在严格模式下分配未定义的变量,它仍然会出错,这证明OP不是处于严格模式,就是已经在其他地方声明了i
,因为他的代码运行(但结果出乎意料)。他应该使用严格模式,这是一个很好的建议,但这不是他问题的原因。@WardD.s.他的代码不捕获异常变量i未定义
。代码应该在控制台中查看相同的对象(角色.长度时间)…不是吗?这也是避免闭包问题的一种方法。我更喜欢以运行回调的方式执行此操作(参见我的答案)但如果您不能实际控制从defineRole运行回调的代码(如果它是第三方库),那么这是完美的
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);
});
}