函数何时以}结束;

时间:2015-05-07 02:58:44

标签: javascript class object

好的,我问了一个问题,而且比我聪明的人说问题是"确切的"我的重复。嗯,它不是,答案没有回答那个人的问题。他想知道如何调用另一个程序,我想知道如何在类中调用一个函数。当我试图找到我的问题的答案并且我正在寻找类似问题的答案时,有人说,有时功能被终止于};其他时间用}和其他时间用},(这个我认为我理解)。但是我无法用押韵或理由看出为什么或何时使用带分号的支架以及何时只使用支架:

这是第一个答案

var ExampleClass = function(){
    this._m_a = null;
};
ExampleClass.prototype.get_m_a = function(){
    return this._m_a;
};
ExampleClass.prototype.set_m_a = function(value){
   this._m_a = value;
}; 

注意这个答案甚至不能解决另一个例行公事的问题!但是函数终止于}; (为什么?)

这是另一个答案:

var M_A = function()
{
    var m_a; //private variable

    this.get = function()
    {
         return m_a;
    }

    this.set = function(value)
    {
         m_a = value;
         RunFunction();    //run some global or private function
         this.runPublic(); // run a public function
    }
}

这家伙有点回答这个问题,但所有的功能都以}结尾,没有分号(为什么?)

最后答案是不能令人满意的,什么是全球或私人功能?什么是公共职能?为什么公共功能引用"这个"。无论如何我可能是村里的白痴,但我仍然不知道如何调用我在课堂上定义的函数,而且我不知道类中函数的终止是否应该是}} ;或只是一个}。所以我现在花了差不多12个小时试图让一个小班在javascript中工作无济于事。

1 个答案:

答案 0 :(得分:2)

有两件事让你沮丧。

第一个是函数声明和函数值之间的区别。

这是一个函数声明:

function foo() {
  // ...
}

这些是函数值:

var bar = function() {
  // ...
};

var bar = function foo() {
  // ...
};

baz(function() {
  // ...
});

函数声明不需要分号。函数值不是完整的语句;完整的陈述确实需要它们(有时)。值得注意的是,在最后三个示例中,分号不会终止函数,它会终止var语句和函数评估语句。

这个“(有时候)”是你遇到问题的第二点:在JavaScript中,如果解释器显然它应该在那里,分号将自动插入换行符。

所以,

x = 5
y = 6

相同
x = 5;
y = 6;

因此,

var bar = function() {
  // ...
}

相同
var bar = function() {
  // ...
};

但是看看这个:

var bar = function() { /* ... */ }; console.log(bar);

没关系(所有需要的分号都在那里);

function bar() { /* ... */ } console.log(bar);

也没关系,因为函数声明语句不需要分号。然而,

var bar = function() { /* ... */ } console.log(bar);

是一个错误,因为变量赋值语句无法与函数调用语句正确分隔。请注意,由于自动分号插入,这有效:

var bar = function() { /* ... */ }
console.log(bar);

编辑:函数声明语句和函数值之间存在语义差异:首先执行函数声明语句(这称为“函数提升”),而作为所有赋值的赋值在顺序:

function pre_fn() {}
var pre_var = function() {};

pre_fn(); // works
pre_var(); // works
post_fn(); // works
post_var(); // error (not defined yet)

function post_fn() {}
var post_var = function() {};

EDIT2:

我怀疑你无法创建的类(如评论中所述,问题中的代码比推测更好)有一个对象文字形式:

var Foo = {
  bar: function() {
    // ...
  },
  baz: function() {
    // ...
  }
};

这里,分号终止var Foo = { /* ... */ }语句。您不能在其中包含分号,原因与您无法编写

相同
var foo = { a = 6; b = 7 }

因为对象文字的语法要求您使用逗号分隔键值对。数值6和函数值function() { /* ... */ }之间没有区别;没有用分号“终止”。