单例模式中 fn.apply(this,arguments) 问题

最近再学习 javascript 设计模式
第一个 单例模式中 有个例子 如下:

 <body>
<button id="loginBtn">登录</button>
<script type="text/javascript">
    var createLoginLayer = function(){
        var div = document.createElement("div");
        div.innerHTML = '我是登录浮窗';
        div.style.display = 'none';
        document.body.appendChild(div);
        return div;
    };

    var getSingle = function(fn){
        var result;
        return function(){
            return result || (result = fn.apply(this,arguments));
        }
    };

    var createSingleLoginLayer = getSingle(createLoginLayer);
    document.getElementById('loginBtn').onclick = function(){
        var loginLayer = createSingleLoginLayer();
        loginLayer.style.display = 'block';
    };
</script>
</body>

实现是 需要登录框时 点击登录时 只出现一个登录框 其中

  var getSingle = function(fn){
        var result;
        return function(){
            return result || (result = fn.apply(this,arguments));
        }
    };
这段代码中fn.apply(this,arguments) 不知道怎么理解 用断点查看 其中的this指向window 但是我用fn();替换也是可以的 不知道fn.apply(this,arguments)这段代码怎么理解 我知道apply() 这个第一个参数是绑定上下文用的, 是否当createSingleLoginLayer()被调用时this是否指向createSingleLoginLayer本身  请解答下

this 不是指向createSingleLoginLayer的,指向window .其实这里的this没有用。
之所以用fn.apply(this,arguments)而不用fn(),是因为要传参数,而且参数的个数不固定。

不是啊,要看fn中有没有用到this中的属性或方法,如果没有这里传null也没有关系。

请问是不是可以这样理解 如果在一个函数中 就像

 var getSingle = function(fn){
        var result;
        return function(){
            return result || (result = fn.apply(this,arguments));
        }
    };

只要有fn.apply(this,arguments) 这种写法。 this就没有用 只是因为参数的个数不固定 所以才这样写