【问题标题】:When does a function get terminated with }; [duplicate]函数何时以 } 终止; [复制]
【发布时间】:2015-05-07 02:58:44
【问题描述】:

好的,我问了一个问题,比我聪明的人说这个问题是我的“完全”重复。好吧,事实并非如此,答案并没有回答这个人的问题。他想知道如何调用另一个程序,我想知道如何调用类内的函数。话虽如此,当我试图找到我的问题的答案并且我正在查看类似问题的答案时,有时函数会以 } 终止;其他时候使用 },其他时候使用 },(我想我理解这个)。但是,我看不出为什么或何时使用带分号的大括号以及何时只应使用大括号:

这是第一个答案

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
    }
}

这家伙有点回答了这个问题,但是所有函数都以 } 结尾,后面没有分号(为什么?)

最后的答案是不尽人意,什么是全局函数还是私有函数?什么是公共职能?为什么公共函数引用“this”。无论如何,我可能是村里的白痴,但我仍然不知道如何从类中调用我在类中定义的函数,也不知道类中函数的终止是否应该使用 };或只是一个}。所以我现在花了将近 12 个小时试图让一个小班用 javascript 工作但无济于事。

【问题讨论】:

  • 在 ASI(自动分号插入) 不成立(例如,下一行以(+ 开头);但是许多人(和 jshint)recommend 终止所有语句/行(除了那些 语句 - 例如 if/while/function -自然以带有分号的}) 结尾。在es5.github.io 和 SO 上查找这些关键字。
  • 请在每个帖子中提出一个具体问题,并省略有关您可能提出的任何其他问题的元数据。
  • 查理,欢迎来到 SO。您能否发布您遇到问题的代码?您指的是没有指向问题/答案的链接的答案和问题。 SO 以各种方式排序,但几乎没有按顺序排序。如果您在获取链接时遇到问题,请单击问题/答案下方的“共享”按钮以检索您可以复制/粘贴的 URL。
  • 好吧,没关系,我将尝试编辑我的另一个问题,该问题也被列为重复。这对我来说是漫长的一天。感谢您的友好回复。

标签: javascript class object


【解决方案1】:

有两件事让你绊倒。

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

这是一个函数声明:

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:

我怀疑您无法创建的类(如 cmets 中所说,问题中的代码会比推测更好)具有对象文字形式:

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

这里,分号终止var Foo = { /* ... */ } 语句。里面不能有分号,因为你不能写

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

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

【讨论】:

  • 谢谢谢谢谢谢哇,这甚至有道理!下次你有工作审查时让你的老板给我打电话,我会给你加薪!!!
猜你喜欢
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 2021-09-04
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 2017-12-01
相关资源
最近更新 更多