求解释这段代码,尤其是两个return

var createIframe=(function(){
    var iframe;
    return function(){
        if(!iframe){
            iframe=document.createElement('iframe');
            iframe.style.display='none';
            document.body.appendChild(iframe);
        }
        return iframe;
    }
})();
阅读 2.3k
2 个回答

这是一个高阶函数,它返回一个函数,它返回的函数的返回值是 iframe
这样形成了一个闭包,保存了iframe的值,不必每次计算;

这样看:

var createIframe=(function(){
    var iframe;
    var r = function(){
            if(!iframe){
                iframe=document.createElement('iframe');
                iframe.style.display='none';
                document.body.appendChild(iframe);
            }
            return iframe;
        };
    return r;
})();

补充:

最外层右半部份是一个立即执行的函数:


var createIframe = (function(){...})();

//相当于
function temp(){
    ...
}
var createIframe = temp();

再补充:
每次使用 createIframe 变量时,使用的其实是这一段代码:

function(){
    if(!iframe){
        iframe=document.createElement('iframe');
        iframe.style.display='none';
        document.body.appendChild(iframe);
    }
    return iframe;
};

这段代码有一个作用域,就是外层function的内部,它声明了一个iframe变量,这个变量会随内层的function一起保存,不会清除

当第一次执行代码,会向 <body> 中增加一个 <iframe> ,返回这个引用,并把它保存在iframe变量中,
iframe变量会一直保存在内存中,不被清除
以后执行代码时,首先判断 iframe 是否存在,如果存在,则直接返回其引用,不再创建新的<iframe>

除了那两个return,还有最后那个();

这里形成了一个闭包环境,通常在不想使用全局变量的时候,会采取这种方式。

先从全局变量的方式去理解。

var iframe;
var createIframe=function(){
    if(!iframe){
        iframe=document.createElement('iframe');
        iframe.style.display='none';
        document.body.appendChild(iframe);
    }
    return iframe;
}

我想这个createIframe方法很好理解,就是只创建一个iframe对象(有单实例的味道)。

其实,return不用多解释。无非就是将值返回给调用者仅此而已。

最后那个()表示该方法会被立即执行,所以createIframe方法的实际处理过程就是return function(){}那部分。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题