Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在函数上传递变量? for(i=0;i_Javascript - Fatal编程技术网

Javascript 如何在函数上传递变量? for(i=0;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

变量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);
    });
}