IFFE与返回函数的函数

时间:2014-10-23 13:43:16

标签: javascript

请考虑以下事项:

var x = (function(){
    var _private = 'start';
    var _x = function(text){
        if(text){
            _private = text;
        }
        else{
            return _private;
        }
    }
    return _x;
})();

console.log(x()); //start
x('end');
console.log(x()); //end

var y = function(){
    var _private = 'start';
    var _y = function(text){
        if(text){
            _private = text;
        }
        else{
            return _private;
        }
    }
    return _y;
}
console.log(y()); //toString of function
y();//invoked function, should return _y?
y('end')
console.log(y()); //toString of function

我需要清楚一点,为什么y函数在被调用后与x函数的行为不同。为什么y函数的行为有所不同,而且我没有得到关于IFFE的总体概念?

小提琴:http://jsfiddle.net/xmmddcgn/

1 个答案:

答案 0 :(得分:4)

在第一个例子中:

var x = (function(){
    var _private = 'start';
    var _x = function(text){
        if(text){
            _private = text;
        }
        else{
            return _private;
        }
    }
    return _x;
})();

var x内部 function,因为外部 function已被调用。

在第二个示例中var y是您在调用它之后的外部function

var y = function () {
    var _private = 'start';
    var _y = function (text) {
        if (text) {
             _private = text;
        } else {
             return _private;
        }
    }
        return _y;
 }

y(); // nothing happens and nobody keep _y's ref.
var p = y(); //p is _y

console.log(p()); //start
p('end')
console.log(p()); //end

然后p将完全是上面的var x