var Bind = function(object, fun) {
return function() {
return fun.apply(object, arguments);
}
}var BindAsEventListener = function(object, fun) {
var args = Array.prototype.slice.call(arguments).slice(2);
return function(event) {
return fun.apply(object, [event || window.event].concat(args));
}
}
请问各位大大,上面的function为什么要用两次return?
这种写法有什么好出?
直接用
var Bind = function(object,fun){
    fun.apply(object,arguments);
}不行么?

解决方案 »

  1.   


    var BindAsEventListener = function(object, fun) {
        var args = Array.prototype.slice.call(arguments).slice(2);
        return function(event) {//这里的return是函数BindAsEventListener的
            return fun.apply(object, [event || window.event].concat(args));//这里的return是函数fun.apply的
    //两个return 是不一样的
        }
    }
      

  2.   

    谢谢LS的回复,不过还是不清楚用两次return的意义何在。
    有那位大大能解释一下的吗?或者介绍本书也行。
    [event || window.event].concat(args)这一句[event || window.event]中,event莫非是个数组?
      

  3.   

    我想问一下lz  
    你知道bind方法可以有什么好处吗??????
      

  4.   

    这要具体问题具体对待啊~
    不是说例子里有两个return,
    那么以后你也要用两个啊,
    你就是用8个也无所谓啊,反正就是后面的东西取得值往前抛呗!event || window.event
    这个完全是浏览器兼容的啊,记住就行了,本来你可以在出现event || window.event的地方只写
    window.event的,但是firefox不认啊~只有ie下面能跑,
    后来有人这么写
    function methodname(e)
    {
    e=event || window.event;
    往后的操作都用e代替}
    再后来见有人直接把形参也用个event的样子,这倒更省事了!后来有人这么写
    function methodname(event)
    {
    event || window.event;}
      

  5.   

    这个我不知道,学js没多长时间,也没怎么看过书,都是一点vbs的基础.
    有什么好处还请多指教.LS的兄弟,关于event你的解释我知道,我想知道的是[event || window.event]这一句中,[]应该是数组用的吧.
      

  6.   

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title></title>
    </head><body>
    <div id="ss" style=" height:100px; width:100px; background-color:#0000FF"></div>
    <script type="text/javascript">
    var Bind = function(object, fun) {
        return function() {
            return fun.apply(object, arguments);
        }
    }var vv = {
    id : "wo are pest",
    say : function(){
    alert(this.id)
    }
    }
    window.onload =function(){ //如果我希望给id为ss的div帮定上say方法 假如我直接赋予
    document.getElementById('ss').onclick = vv.say;
    /*
    可以写成 document.getElementById('ss').onclick = function(){alert(this.id)}
    可以看到ss元素调用的函数 所以 this就指向了ss   alert出来的就变成了ss
    */


    //------------------------------------------------------------------------------------

    //如果这么写
    //document.getElementById('ss').onclick = Bind(vv,vv.say);
        /*
        就可以把vv.say这个函数里面的this指向ss元素
    当然不紧紧只是可以这么写 
    Bind(xx,vv.say) xx代表任何对象 也是可以的 只是注意 不要报错了...


    这是我认为bind的用法  
    */

    }
    </script></body>
    </html>
      

  7.   

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title></title>
    </head><body>
    <div id="ss" style=" height:100px; width:100px; background-color:#0000FF"></div>
    <script type="text/javascript">
    var Bind = function(object, fun) {
        return function() {
            return fun.apply(object, arguments);
        }
    }var vv = {
    id : "wo are pest",
    say : function(){
    alert(this.id)
    return this.id
    }
    }
    window.onload =function(){
     var ss ={};
    ss.ee = Bind(vv,vv.say);
        /*
    说一下为什么要有return
    上面的可以看成
    ss.ee = (function(object, fun) {
    return function() {
    return fun.apply(object, arguments);
    })(vv,vv.say);
    执行完毕bind函数后 回返回一个function  就成了
    ss.ee = function() {
    return fun.apply(object, arguments);
    }
    这就是第一个return 的作用了



    当执行ss.ee的时候
          如果不要第2个return 会发现 say方法里面的return 的直取不到
    */
     var cc = ss.ee();
     alert(cc)  //可以把Bind方法里面的 第2个renturn去掉试试
     
     //第2个return 是当函数有返回直时用到的
    }
    </script></body>
    </html>