5

以下是在闭包中定义匿名函数,调用该函数,然后忘记它的方法:

(function () { "do stuff"; })();

这用于在不向脚本添加大量内容的情况下保持有限的范围(IIFE:立即调用函数表达式)。

如果您希望立即执行一个函数,同时仍保留该函数以供将来使用,如下所示:

var doThing;
(doThing = function () { "do stuff"; })();

这适用于我测试过的浏览器(Chrome、FF、IE8、IE10),但这不会通过 JSLint(错误调用)。这样做有兼容性问题吗?

有没有一种方法可以实现 JSLint 的善意?

4

5 回答 5

7

如果通过 jslint 是绝对必要的,那么:

var doThing;
(doThing = function () { "do stuff"; }).call();

应该做的工作。

编辑

在传递参数.call

var doThing;
(doThing = function (param1, param2) { 'do stuff'; }).call(this, arg1, arg2);
于 2012-09-10T20:43:27.027 回答
3

稍微重新排序您的代码将有所帮助。

var doThing = function () { "do stuff"; };
doThing();

或者

var doThing = function () { "do stuff"; };
(doThing)();
于 2012-09-10T20:34:23.793 回答
3

您不应同时分配函数引用并调用该函数。这种事情很容易导致头脑爆炸,因为它会增加已经存在的可能性:将变量分配给引用,将变量分配给返回,或将变量分配给赋值的结果。这样做的任何其他人都能够阅读您的代码的方法是在 2 行中完成。如果你想把它包装在一个函数中,它会是这样的:

var doThing = (function() {
  var inner = function() {
     //doThing body
  };
  inner();
  return inner;
})();

这本身只会给您带来混淆,而不是以简单的方式进行操作,因为无论如何调用都不会留下来。但是,如果您真的想创建一个执行此操作的函数,您可以:

var callAndRef = function(funk) {
  funk();
  return funk;
};

接着

var doThing = callAndRef(function() {
//doThing body
});

或者,如果您感觉更棒,并且有 JS 专家与您合作,您可以将它扔到 Function.prototype 并将其与声明链接起来。您还可以加入调用/申请以维护this参考和参数(但对于您当前的问题,这似乎只是噪音)。

所有这一切都应该非常谨慎地完成,当然不值得走这条路来省去自己不得不输入几行一个命令的额外行。

于 2012-09-10T20:32:48.170 回答
0

如果您只想修复错误调用问题,您可以这样做:

var doThing;
doThing = function () { "do stuff"; };
doThing();

通过拆分声明和赋值,您可以使您的代码更易于理解和维护。另一种选择是声明一个具有名称的函数:

function doThing() { "do stuff"; }
doThing();
于 2012-09-10T21:15:53.403 回答
-1

JSLink 是 Crawford 对如何编写 Javascript 的个人意见。其中大部分是极好的建议,但有时他的意见似乎会妨碍您。

这是编写该行的更“标准”方式:

var doThing = (function () { "do stuff"; }());

注意整个 (function ...) 在括号内。

于 2012-09-10T20:34:00.007 回答