首页 新闻 会员 周边 捐助

关于javascript回调,请问这两段代码有什么区别?

0
悬赏园豆:5 [待解决问题]
var singleton = function(fn) {    
        var result;    
        return function() {   
            return result || (result = fn.apply(this, arguments));    
        }
    } 
var createMask = singleton(function() { 
    return document.body.appendChild(document.createElement('div'));  
});
createMask();
var singleton = function(fn) {    
        var result;    
        return function() {   
            return result || (result = fn());    
        }
    } 
var createMask = singleton(function() { 
    return document.body.appendChild(document.createElement('div'));  
});
console.log(createMask());

区别在于:fn()和fn.apply(this, arguments);
结果都是一样..
能不能说下具体什么原因?

深蓝色梦想的主页 深蓝色梦想 | 初学一级 | 园豆:6
提问于:2012-11-21 01:18
< >
分享
所有回答(4)
1

fn()没有参数时二者无差别;如果需要传不确定个数的输入参数时,就只能选择fn.apply

Luics | 园豆:244 (菜鸟二级) | 2012-11-21 02:07
0

主要还是涉及到作用域的区别,其他的还真没有其他的区别

chenping2008 | 园豆:9836 (大侠五级) | 2012-11-21 09:07
0

作用域的区别

jason2013 | 园豆:1998 (小虾三级) | 2012-11-21 09:23
0
var singleton = function(fn) {    
        var result;    
        return function() {  //代码三
            return result || (result = fn.apply(this, arguments));    
        }
    } 
var createMask = singleton(function() { //代码二
    return document.body.appendChild(document.createElement('div'));  
});
createMask();  //代码一

这里先忽略fn.apply(this, arguments)以及fn()之间的区别,我们先看下执行createMask这个方法时,发生了什么事情

1)createMask方法 的本质,是singleton方法执行后返回的一个函数(代码三),而singleton方法执行的时候传入参数,就是代码二那里的一个匿名函数,将代码结构稍做调整可得到如下代码

//代码四
var
createMask = function(param_0){ var result; var fn = function(){ return document.body.appendChild(document.createElement('div')); }; return result || (result = fn.apply(this, arguments)); } createMask();

2)原始代码示例的createMask调用,是没有传入参数的,即createMask(),假如这个时候createMask方法需要传入一些传输,比如上面代码四的param_0,该怎么做呢?

很自然的,我们想到可以这样调用createMask(param_0)

假如又新增一个param_1参数呢?简单,createMask(param_0, param_1)

假如又新增一个param_2参数呢?。。。没完没了了

有没有一劳永逸的办法,无路那我传多少个参数,都不用再去改上面的代码?

答案是:apply方法

3)apply方法的使用:func.apply(thisObj, arguments)

thisObj:func方法被调用时,方法内部this指针指向的对象

arguments:func方法被调用时,传递给func的参数,通过数组的形式传入

举例:

function hello(a ,b){
    alert(this);  //this指针默认指向window,具体可参见 javascript权威指南
    alert(a+',' +b);
}

hello.apply(null, [1, 2]);  //这段代码执行下就大致明白了

4)具体到最初的例子,如果createMask压根就不会有参数,那fn.apply(this, arguments)的确是不必要的

程序猿小卡 | 园豆:386 (菜鸟二级) | 2012-12-08 00:33

就是说fn.apply(this, arguments)只是为了方便传递参数而已

支持(0) 反对(0) 深蓝色梦想 | 园豆:6 (初学一级) | 2012-12-08 09:34

@深蓝色梦想: 是的,可以这么认为 :-)

支持(0) 反对(0) 程序猿小卡 | 园豆:386 (菜鸟二级) | 2012-12-08 10:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册