从匿名立即调用的函数表达式返回|它去哪儿了?

时间:2012-08-18 23:58:36

标签: javascript

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

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

这是否有任何有用的应用程序?

4 个答案:

答案 0 :(得分:8)

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

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

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

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

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

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


关于返回值的有用性。如果将返回值分配给变量或将其用作其他函数的输入,则会很有用,但如果不将其用作输入,则无效。

答案 1 :(得分: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之间创建了一个闭包(到el),因此在我们卸载页面之前它可能不会被垃圾收集,除非编译器足够聪明地知道闭包没有被使用

闭包是以这种方式使用IIFE的结果,但这是一个微不足道的问题,除非IFFE很大且闭包很浪费(在很多情况下它们很有用)。

答案 2 :(得分:1)

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

var foo = (function(){ return 'foo' }()); // this makes sense

答案 3 :(得分:0)

由于正在执行的函数,返回了foo。如果将其分配给变量或传递给另一个函数,它将“存在”:

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

这有帮助吗?