在就绪处理程序中使用字符串调用函数...不起作用

时间:2015-09-22 20:21:01

标签: jquery anonymous-function document-ready

所以你想要执行一个名字在字符串或变量中的函数:

var fn = "foobar";

function foobar() {
    console.log('say something');
}

这样的答案 - How to execute a JavaScript function when I have its name as a string - 说要做到这一点:

window[fn](); // outputs 'say something'

但是...... 这个由于某种原因不起作用:

jQuery(document).ready(function($){
    var fn = "foobar";

    function foobar() {
        console.log('say something');
    }

    window[fn](); // undefined
});

有效:

jQuery(document).ready(function($){
    var fn = "foobar";

    window[fn](); // outputs 'say something'
});

/* I'm outside the ready handler */

function foobar() {
    console.log('say something');
}

我希望将我的函数保留在那个就绪处理程序中,这样我就不必编写一堆匿名函数来将jQuery定义为$。我该怎么做?

更新

以下是我想要做的事情:

<div data-control="toggleNext">FAQ</div>
<div>Here's some text that will be hidden until toggled</div>

JS:

jQuery(document).ready(function($){

    function toggleNext() {
        // add ".js_toggled" to .next() element
    }

    $('[data-control]').each(function(){
        var fn = window[$(this).data('control')]; // <-- this don't werk
        if (typeof fn === 'function') fn(this);
    });

});

1 个答案:

答案 0 :(得分:2)

如果你的函数在ready处理程序中,它将不会在window上可用,除非你专门设置它。但是,无论如何,这只是一个坏主意,只需将window从其中删除,并在您的doc ready块中定义您自己的对象。

jQuery(document).ready(function($){
    var fn = "foobar", methods = {};
    methods[fn] = function () {
        console.log('say something');
    }
    $('[data-control]').each(function(){
        var fn = methods[$(this).data('control')];
        if (typeof fn === 'function') fn(this);
    });
    //methods[fn](); 
});