新手:关于函数对象

这样写是对的

var byteArrayUntil=(function(){
   getUseData=function(data,offset){
        var arr=[];
        for(var i=0;i<=799;i++){
            arr.push(i);
        }
        return arr;
    }
   getUseJson=function(data,offset){
        var arr=[];
        for(var i=0;i<=500;i++){
            arr.push(i);
        }
        return {'hz':arr};
    }
return this;
})();
console.log(byteArrayUntil.getUseJson());
但是这样:
    var byteArrayUntil=(function(){
   this.getUseData=function(data,offset){
        var arr=[];
        for(var i=0;i<=799;i++){
            arr.push(i);
        }
        return arr;
    }
   this.getUseJson=function(data,offset){
        var arr=[];
        for(var i=0;i<=500;i++){
            arr.push(i);
        }
        return {'hz':arr};
    }

})();
console.log(byteArrayUntil.getUseJson);
这是为什么呢?
阅读 2.5k
5 个回答
var byteArrayUntil=(function(){
   getUseData=function(data,offset){   //敲黑板!!!划重点!面试必考题! 声明变量不写var,就等于 window.getUseData
        var arr=[];
        for(var i=0;i<=799;i++){
            arr.push(i);
        }
        return arr;
    }
   getUseJson=function(data,offset){
        var arr=[];
        for(var i=0;i<=500;i++){
            arr.push(i);
        }
        return {'hz':arr};
    }
return this; //这里this是什么呢?是运行的上下文,这是个立即执行函数,是谁执行了它捏?是window,所以这里的this就是window 对象,辣么var byteArrayUntil = 这个return的this,辣么,byteArrayUntil 就指向了window。
})();
console.log(byteArrayUntil.getUseJson()); // 所以,byteArrayUntil.getUseJson() 就等于 window.getUseJson()

同样道理,下面那个报错的代码块
this依然等于window,this.getUseJson就等于window.getUseJson和上一题一样
但是,byteArrayUntil在这里啥都不是啊。。因为立即执行函数木有return,它就是个undefined。
so,undefined.getUseJson()必然报错了。

第2种写法的this指向全局window,你在window.getUseJson就可以看到了

因为第二种你没有返回这个对象啊,你调用了一个立即执行的函数,将其结果赋值给byteArrayUntil,但是第二种写法中你的这个函数没有返回啊

看第一个,第一个的return this 里面的this是window,也就是你把 byteArrayUntil = window 了

还有,你定义的getUseJson,其实是定义成全局变量了。

第二个,我不知道你想干什么,

function(){
   this.getUseData=function(data,offset){
        var arr=[];
        for(var i=0;i<=799;i++){
            arr.push(i);
        }
        return arr;
    }
   this.getUseJson=function(data,offset){
        var arr=[];
        for(var i=0;i<=500;i++){
            arr.push(i);
        }
        return {'hz':arr};
    }

}

这是一个构造函数,没有返回任何东西,byteArrayUntil为undefined。

其实你把byteArrayUntil给console出来,就都清楚了

作用域的问题。

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