Javascript jQuery.click命令顺序

Javascript jQuery.click命令顺序,javascript,jquery,click,Javascript,Jquery,Click,这是一个非常简单的问题,我可以很容易地解决它,但由于我在学习javascript,我非常渴望知道为什么会发生这个特定的问题 $("#go").click(function() { $("p").append(array[x] + " ") functionlist[array[x]]() x++ })​ 这并不像我期望的那样有效。我希望它写入数组的当前内容,执行与某个函数名关联的简单动画,然后递增x。除了不增加x之外,一切都正常 如果我这样做: $("#go").cli

这是一个非常简单的问题,我可以很容易地解决它,但由于我在学习javascript,我非常渴望知道为什么会发生这个特定的问题

$("#go").click(function() {
    $("p").append(array[x] + " ")
    functionlist[array[x]]()
    x++
})​
这并不像我期望的那样有效。我希望它写入数组的当前内容,执行与某个函数名关联的简单动画,然后递增x。除了不增加x之外,一切都正常

如果我这样做:

$("#go").click(function() {
    $("p").append(array[x] + " ")
    //functionlist[array[x]]()
    x++
})​
x已成功递增

所以我的问题是,为什么会发生这种情况


这里有一个指向我正在使用的JSFIDLE的链接:

如果您检查脚本控制台F12是否是大多数浏览器,您会看到functionlist[array[x]]抛出一个类似以下的错误:

对象没有方法smooch

这是因为array[x]等于smooch,而functionlist[smooch]未定义,所以它会在进入x++之前出错

此代码中的其他内容:

x是在函数内部声明的,因此在使用它时它将始终为0。 即使它是在您的函数之外声明的,当您增加它时,它也会在数组中用完要查看的项。这里需要使用一个或两个模运算符。 您没有引用具有$.fn.transition定义的.js文件,因此您的转换调用也将出错。 flip和flop都有相同的rotateY值,所以一旦它翻转,它就不会翻转 下面是一些可能会做你想做的事情:

更新后的代码:

var array = ["smooch", "jab", "flip"];
var move = "flip";
var x = 0;
var functionlist = {
    flip: function() {
        $("#block").transition({
            perspective: '0px',
            rotateY: '180deg'
        }, 1000);
    },
    flop: function() {
        $("#block").transition({
            perspective: '0px',
            rotateY: '0deg'
        }, 100);
    }
};


$("#go").click(function() {
    var functionName = (x % 2 == 0) ? 'flip' : 'flop';
    var fn = functionlist[functionName];
    if($.isFunction(fn)) {
        fn();
    }
    var say = array[x % array.length];
    $('p').append(say + ' ');
    x++;
})​;

编辑:使用$.isFunction check更新。

如果您检查脚本控制台F12是大多数浏览器,您将看到functionlist[array[x]]抛出类似以下内容的错误:

对象没有方法smooch

这是因为array[x]等于smooch,而functionlist[smooch]未定义,所以它会在进入x++之前出错

此代码中的其他内容:

x是在函数内部声明的,因此在使用它时它将始终为0。 即使它是在您的函数之外声明的,当您增加它时,它也会在数组中用完要查看的项。这里需要使用一个或两个模运算符。 您没有引用具有$.fn.transition定义的.js文件,因此您的转换调用也将出错。 flip和flop都有相同的rotateY值,所以一旦它翻转,它就不会翻转 下面是一些可能会做你想做的事情:

更新后的代码:

var array = ["smooch", "jab", "flip"];
var move = "flip";
var x = 0;
var functionlist = {
    flip: function() {
        $("#block").transition({
            perspective: '0px',
            rotateY: '180deg'
        }, 1000);
    },
    flop: function() {
        $("#block").transition({
            perspective: '0px',
            rotateY: '0deg'
        }, 100);
    }
};


$("#go").click(function() {
    var functionName = (x % 2 == 0) ? 'flip' : 'flop';
    var fn = functionlist[functionName];
    if($.isFunction(fn)) {
        fn();
    }
    var say = array[x % array.length];
    $('p').append(say + ' ');
    x++;
})​;

编辑:用$.isFunction check更新。

var x=0-每次单击都将x重新定义为零。我认为在第二种情况下x也不会增加…我的错,但是如果我在全局空间中定义x=0,我的问题仍然存在。没有函数接吻,抛出错误,不执行x++未捕获类型错误:functionlist没有方法'smooch'var x=0-每次单击都将x重新定义为零。我认为在第二种情况下x也不会增加…我的错,但是如果我在全局空间中定义x=0,我的问题仍然存在。没有函数smooch,抛出错误,不执行x++UncaughtTypeError:functionlist没有“smooch”方法我很惊讶地看到F12也可以在Chrome中工作。我以为这是IE9的特色菜,太棒了!谢谢你。关于如何让代码实现数组内容是否也是函数名的提示或指针?在这种情况下执行它?@LeMarcin是的,如果您使用jQuery,您可以执行:$.isFunctionsomeobj。。。我会更新答案。这太棒了!使用$.isFunction,我可以得到我想要的结果。虽然翻转和翻滚/阵列没有选项不是我的预期用途,但我很好奇你是如何让它们循环的。特别是[x%array.length]的作用是什么?我算出x%2==0?”flip':'flop';一直在一个和另一个之间运行,但它是如何做到的?%是模运算符。基本上,a%b将返回a/b的其余部分。。。所以1%3==1,2%3==2,3%3==0,4%3==1。。。无限循环遍历数组中的项是一个技巧:whiletrue{alertmyArray[i++%myArray.length];}我很惊讶地看到F12在Chrome中也能工作。我以为这是IE9的特色菜,太棒了!谢谢你。关于如何让代码实现数组内容是否也是函数名的提示或指针?在这种情况下执行它?@LeMarcin是的,如果您使用jQuery,您可以执行:$.isFunctionsomeobj。。。我会更新答案。这太棒了!使用$.isFunction,我可以得到我想要的结果。虽然翻转和翻滚/阵列没有选项不是我的预期用途,但我很好奇你是如何让它们循环的。特别是[x%array.length]的作用是什么?我算出x%2==0?”flip':'flop';一直在一个和另一个之间运行,但它是如何做到的?%是模运算符。基本上,a%b将返回剩余部分 a/b。。。所以1%3==1,2%3==2,3%3==0,4%3==1。。。无限循环数组中的项是一个技巧:whiletrue{alertmyArray[i++%myArray.length];}