如何简洁地分配并立即调用函数变量?

时间:2012-09-10 20:27:45

标签: javascript function jslint iife

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

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

这用于维持有限的范围而不向脚本添加批量(IIFE:立即调用的函数表达式)。

如果您希望立即执行某个功能,同时仍保留该功能以备将来使用,如下所示:

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

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

JSLint是否有办法实现这一目标?

5 个答案:

答案 0 :(得分:7)

如果绝对需要传递jslint,那么:

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

应该做的。

修改

.call

期间传递参数
var doThing;
(doThing = function (param1, param2) { 'do stuff'; }).call(this, arg1, arg2);

答案 1 :(得分: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引用和参数(但看起来这只会是您当前问题的噪音)。

所有这一切都应该以极其谨慎的方式完成当然不值得走这条路线来节省自己每次输入几行额外的一行命令。

答案 2 :(得分:3)

对代码进行轻微重新排序会有所帮助。

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

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

答案 3 :(得分:0)

如果您只想修复错误调用问题,可以执行以下操作:

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

通过拆分声明和分配,您可以更轻松地理解和维护代码。另一种选择是声明一个名为的函数:

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

答案 4 :(得分:-1)

JSLink是Crawford关于如何编写Javascript的个人观点。其中大部分都是出色的建议,但有时候他的意见似乎也会受到影响。

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

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

注意整个(功能......)在parens里面。