是否可以定义AND一次性调用一个函数?

时间:2015-05-14 21:48:02

标签: javascript jquery

我的网站上有一些代码

$(function () {
    for (var k = 0; k < ogmap.length; ++k) {
        $('#orglist').append($('<option></option>').text(ogmap[k]['orgname']).val(ogmap[k]['orgname']));
    } // create organization option memu from list of organizations

    function updateInfo() {
        var newlySelectedOrg = $('#orglist option:selected').val();
        $('#currorg').text(newlySelectedOrg);
        var categories = [];
        for (var k = 0; k < ogmap.length; ++k) {
            if (ogmap[k]['orgname'] == newlySelectedOrg) {
                categories = ogmap[k]['catnames'];
                break;
            }
        } // Get array of strings corresponding to the categories for the selected organization in
        $('#catlist > option').each(function () {
            $(this).remove();
        }); // remove current <option> list items for the categories <select> list
        for (var k = 0; k < categories.length; ++k) {
            $('#catlist').append($('<option></option>').text(categories[k]));
        } // add new <option> list items for the categories <select> list
    }

    updateInfo();

    $('#orglist').change(function () {
        updateInfo();
    });

});

因为我需要定义updateInfo函数并运行它,因为它是我页面预处理的一部分。我知道

var updateInfo() = function() { ... }

或等效

function updateInfo() { ... } 

定义功能并且不运行它,

(function() { ... })

运行它但保持匿名。

是否可以定义并运行它?

出于某种原因,

function updateInfo() { ... };
updateInfo();

只是以错误的方式揉搓我,让我感觉我没有使用最佳实践。

8 个答案:

答案 0 :(得分:2)

没有优雅的方法可以做到这一点,你得到的是如何做到这一点

function updateInfo() { ... };
updateInfo();

$('elem').on('event', updateInfo);

为了完整性,您可以触发事件以在第一个页面加载以及事件触发时运行该函数。

$('elem').on('event', function updateInfo() {
   // inside updateInfo
}).trigger('event');

答案 1 :(得分:2)

不,不可能声明一个函数并在同一个运行中调用它。

但是,如果您不需要声明变量(在调用后使用),则可以使用立即调用的函数表达式(IIEFE)。

如果您需要引用其正文中的函数(对于递归调用或类似函数),您仍然可以name it进行IINFE。

对于您的实际用例,将其作为事件处理程序附加并立即调用它进行初始化,您可以使用不同的模式 - 只需立即触发事件:

$('#orglist').change(updateInfo).change();

// instead of
$('#orglist').change(updateInfo);
updateInfo();

答案 2 :(得分:1)

你可以这样做,但我建议使用你发布的最新版本。以下代码段将记录running foo...两次:

var foo = (function bar() {
  console.log('running foo...');
  return bar;
})();

foo();

答案 3 :(得分:1)

&#13;
&#13;
// Define and run
(updateInfo = function( message ) {
    var el = document.createElement('div');
        el.innerHTML = message;
    document.body.appendChild(el);
})('Meow!!');

// Run again later
updateInfo('Bark!');
&#13;
&#13;
&#13;

答案 4 :(得分:1)

这会提醒Success两次:

&#13;
&#13;
(window.test= function() {
  alert('Success');
})();

test();
&#13;
&#13;
&#13;

答案 5 :(得分:0)

(function functionName () { ... })();

这将命名该函数并同时执行它。虽然我确实建议您保持定义该功能。

答案 6 :(得分:0)

如果将命名函数绑定到事件并且想要在页面加载时运行该事件,则只需要在同一元素上使用.trigger('event')event()触发事件。 / p>

因此,请更换:

updateInfo();

$('#orglist').change(function () {
    updateInfo();
});

使用:

$('#orglist').change(updateInfo)
.change();

答案 7 :(得分:0)

如果您的功能不需要返回任何内容,它可以自行返回,您可以按照自己的意愿行事。我不明白标准方式是如何不优雅的 - 它是可读的。但如果你真的想混淆你的jr开发人员:

var t = function(){
  console.log("Weee");
  return arguments.callee;
}();

t();

然后真的弄乱了头脑....

var t = function(){
  console.log("Weee");
  return arguments.callee;
}();

t()()()();