javascript闭包调用报错:xxx is not a constructor

一个简单的闭包写法:

var ScrollLoad = function () {    
    var _range = 80;             //距下边界长度/单位px
    var _loaded = false;            //是否所有数据已加载完
    var _pageIndex = 1;   
    //其他代码
    //...略
    return  {       
        Range : _range,
        Loaded : _loaded,
        PageIndex : _pageIndex
    }
}();

页面中调用:

console.info(ScrollLoad.Range);

此调用正确,输出为80

而这样调用:

 var a = new ScrollLoad();
        console.info(a.Range);


报错:

TypeError: ScrollLoad is not a constructor

提示scrollload不是一个构造函数。

原因分析,这个闭包返回的是一个 return {...} ,{...}里面的部分其实是一个对象,而且这个返回的对象必须是键值对形式出现。我们知道键值对出现的标志就是中间有半角冒号隔开。

那如果想使用var a=new ScrollLoad();这样方式调用,闭包应该怎么写。其实其他方面都一样,只是返回部分写法改变。

var ScrollLoad = function () {    
    var _range = 80;             //距下边界长度/单位px
    var _loaded = false;            //是否所有数据已加载完
    var _pageIndex = 1;   
    //其他代码
    //...略
    return function () {
        this.Range = _range;        
        this.Loaded = _loaded;
        this.PageIndex = _pageIndex;
    }
}();

与上面的写法比较下可以发现,返回的是一个匿名函数。并且写法不是键值对形式了。而且这里this不能少,如果少了this,会直接报undefined错误。这里的加上this表示Range属于对象ScrollLoad,如果不加,则Range意味着未定义。

另外还有一点,我们经常见到的 var ScrollLoad=function(){//这里是代码}()这种写法与var ScrollLoad=(function(){//这里是代码})() 是等价的,都表示函数自调用。把匿名函数部分代码用圆括号包括起来是为了使代码在比较长的情况下看着归属关系清晰

猜你喜欢

转载自blog.csdn.net/sxf359/article/details/78222960
今日推荐