问答详情
源自:2-1 基本JS、JQ开发结构搭建

为什么用表达式写Carouset

为什么是用函数表达式写Carouset, 

是为了模块化? 

Caroust 是一个实例?  init 方法是添加到实例上的?

init方法 会不会被所有实例继承  每一个实例都会创建一个init对象吗 ?

提问者:mimaolu 2015-10-20 23:39

个回答

  • HelloLone
    2015-12-25 11:10:21
    已采纳

    声明函数的两种方式:

    1. function A(){}

    2. var A = function(){};

    第一种方式的声明无论函数放在什么地方,运行时都会优先执行。第二种在运行时是按顺序执行。

    我们可以测试一下:

    alert(typeof a);   // undefined   因为是顺序执行,此时a还未定义
    var a = function(){ alert('a')};
    alert(typeof a);   // function   因为function声明被优先执行,此时a为function
    function a(){ }


    明白了两者的区别,那么哪种写法更好呢?假设我们的项目是多人在开发,我们都约定用第一种方式写函数。当两个人分别在各自的js文件定义了一个function A, 这两个文件被合并后加载到页面上,那么最后只会运行一个人写的。

    // 文件1
    function A(){ alert('A');}
    A();  // AA
    
    // 文件2
    function A() { alert('AA'); }
    A();   // AA

    我们发现两处都输出了 AA, 而不是我们预期的。那么我们改为第二种写法就没问题了:

    // 文件1
    var A = function (){ alert('A');}
    A();  // A
    
    // 文件2
    var A = function () { alert('AA'); }
    A();  // AA

    不知道这么讲你明白没有,希望对你有帮助。

    Carouset被定义为一个类,不是实例。致于init方法是类的静态方法,不会被实例调用的。只有在类中通过

    this.method = function(){};

    或者:

    Carouset.prototype.method = function(){};

    这样声明的方法才可以被实例调用。

    var A = function (){ this.name = 'A'; } //声明类,属性name
    A.init = function(){  return new this; }; //声明类静态方法init, 这里的this是类本身而非实例
    var a = new A;
    alert(typeof A.init);  //function
    alert(typeof a.init);  //undefined
    alert(a.name);  // A
    A.prototype.getName = function(){return this.name; };
    alert(a.getName()); // A