4

如果我从匿名立即调用的函数表达式返回一个对象,它会去哪里?例如 foo 在这段代码中的位置......

(function(){ 
    var foo;
    return foo;
})();

这有什么有用的应用吗?

4

4 回答 4

9

从您的自动执行函数返回一个值而不将该返回值分配给结果变量只是一个返回值,它无处可去,因此不会在您的函数中创建对数据的新引用。所以一旦函数返回,数据就会被垃圾回收,就像你没有返回语句一样。所以这:

(function(){ 
    var foo;
    return foo;
})();

与从函数返回值并且不将返回的值分配给任何东西没有什么不同。

您可以这样做来捕获返回值:

var result = (function(){ 
    var foo = "hello";
    return foo;
})();

工作演示:http: //jsfiddle.net/jfriend00/t9wJL/


至于返回值的用处。如果您将返回值分配给变量或将其用作其他函数的输入,这很有用,但如果您不这样做,则什么也做不了。

于 2012-08-19T00:55:18.630 回答
2

一个有用的应用是功能测试。例如,有些浏览器支持textContent属性,有些支持innerText,有些支持两者。我可以编写一个函数来测试支持并使用适当的属性:

function getText(el) {

  if (typeof el.textContent == 'string') {
    return el.textContent;

  } else if (typeof el.innerText == 'string') {
    return el.innerText;
  }
}

您可能会觉得每次都进行相同的测试效率低下(不是很多),因此您可能希望检测支持并创建一个只执行一次测试的函数,然后使用适当的属性,例如:

var getText = (function() {
  var el = document.createElement('div');

  if (typeof el.textContent == 'string') {
    el = null;
    return function (el) { return el.textContent;};

  } else if (typeof el.innerText == 'string') {
    el = null;
    return function (el) { return el.innerText;};
  }
}());

上面的函数有一点缺陷,它们只是示例。

请注意,可以省略左括号和右括号,但是在阅读代码时使用它们会有所帮助,您知道它是从第一行开始立即调用的函数表达式(IIFE),而不是在中间或末尾的某个位置。

主要好处是能够运行一些代码,而无需创建不必要的全局引用,然后必须清理它们。上面的示例在返回的函数和 IIFE 之间创建了一个闭包 (to el),因此在我们卸载页面之前它可能不会被垃圾收集,除非编译器足够聪明地知道该闭包没有被使用。

闭包是以这种方式使用 IIFE 的结果,但这是一个无关紧要的问题,除非 IFFE 很大并且闭包是浪费的(在许多情况下它们很有用)。

于 2012-08-19T00:33:03.757 回答
1

如果自执行函数的目的是创建一个新范围,那么返回一些东西是没有意义的。如果函数被分配给一个变量,那么返回的值将被分配给它。

var foo = (function(){ return 'foo' }()); // this makes sense
于 2012-08-19T00:06:30.450 回答
0

foo 作为正在执行的函数的结果返回。只有将它分配给变量或传递给另一个函数时,它才会“存在”:

var x = (function(){ 
    var foo;
    return foo;
})();
console.log(x)

这有帮助吗?

于 2018-03-06T09:07:09.617 回答