用函数声明公开函数

时间:2014-09-03 21:34:50

标签: javascript

现在我有以下设置:

var foo = 'bar';
function alertFoo() {
    alert(foo);
};

如果我想范围foo以使其不是全局的,我可以使用以下函数表达式来完成:

var alertFoo = (function() {
    var foo = 'bar';
    return function() {
        alert(foo);
    }
)();

有没有办法将此函数表达式转换为类似于第一个代码示例的函数声明?

3 个答案:

答案 0 :(得分:4)

更新回答

重新评论:

  

外面的人,我喜欢alertFoo来悬挂

嗯,你可以这样做:

function alertFoo() {
    var foo = 'bar';

    doTheAlert();

    function doTheAlert() {
        alert(foo);
    }
}

......但我无法想象这真的适合您的需求。除此之外,不,你不能把它吊起来。

原始回答

是的,您可以在函数表达式中声明函数,如下所示:

var alertFoo = (function() {
    var foo = 'bar';

    return alertFoo;

    function alertFoo() {
        alert(foo);
    }
}();

或者您可以声明作用域函数,然后调用它,但是然后在当前作用域中创建另一个符号:

function scoping() {
    var foo = 'bar';

    return alertFoo;

    function alertFoo() {
        alert(foo);
    }
)
var alertFoo = scoping();

答案 1 :(得分:1)

你可以这样的方式声明alertFoo,以便在第一次调用它时用一个闭包替换它自己:

function alertFoo() {
    var foo = 'bar';
    alertFoo = function() {
        alert(foo);
    };
    alertFoo();
}

这为你提供了两个世界中最好的:一个提升和关闭的函数声明。

演示这是有效的:

function foo() {
    var counter = 0;
    foo = function() { console.log(counter++); };
    foo();
}

输出:

  

> FOO()
  0
  > FOO()
  1
  > FOO()
  2

这种方法的一个缺点是alertFoo在第一次调用时成为不同的对象。如果在alertFoo首次执行之前创建了对{{1}}的引用,这可能会导致问题。

答案 2 :(得分:-2)

研究关闭。

(function( global ) {
  var foo = 'bar';
  function alertFoo() {
    alert(foo);
  };
})( window );