Javascript:向我解释一下这个语法

标签 javascript syntax

这里是 JS 新手,我最近一直在查看一些代码,其中使用的语法我不太熟悉。这是一个示例,后面是我的问题:

function Group(args) {
  this.showItem = showItem;
  function showItem(args) {
    ...
  }
}
var group = new Group (args);

问题:

  1. 据我了解,创建function Group然后通过group = new Group实例化本质上相当于定义一个类然后实例化该类的对象的原型(prototype)类(class)。这是正确的吗?

  2. 关于Group的属性(方法?),上面的showItem调用的语法是什么?为什么不直接定义它:

    this.showItem = function(args){...};
    

    将代码更改为上述内容是否会改变任何不同的行为?

  3. 如果您按照上面的方式定义了它,那么该语法称为什么?

最佳答案

  1. Group 函数被用作构造函数;你的直觉基本上是正确的。

  2. 没有充分的理由使用像 this.showItem = function(args){...}; 这样的匿名函数表达式,除非您想要重用局部变量 showItem

  3. 我不确定您指的是哪种语法。 function(args){...} 是一个匿名函数表达式,this.showItem 引用对象 this 的成员>。总而言之,我想你可以称之为“设置对象的成员函数”。

额外提示(也许您已经知道?):您可以在定义之前使用 showItem 的原因是 function hoisting .

编辑:

您似乎在询问 function expressions versus function declarations以及命名函数与匿名函数。主要区别是:

  • 函数声明始终独立。它们绝不是其他操作的一部分,例如任务。您的第一个示例使用函数声明 function showItem(args) {...}。函数表达式在某些操作中用作表达式(例如,赋值、作为参数传递等)。您的第二种情况使用函数表达式。

  • 函数声明被提升到当前函数作用域的顶部,因此第一种情况下的 showItem 已被定义,并在您在赋值操作中使用它时包含该函数。函数表达式不会被提升。

  • 函数声明总是被命名的。函数表达式可以是命名的或匿名的。当使用名称定义函数时,可以通过函数对象的 name 属性来访问该名称。函数的名称是不可变的,并且独立于保存函数引用的任何变量。此外,函数体内的代码可以通过函数名称作为局部变量来引用该函数(这有时对于命名函数表达式内的递归很有用)。

查看:

  • 函数定义:function showItems(args){...};
  • 匿名函数表达式:this.showItems = function(args){...};
  • 命名函数表达式:this.showItems = function showItemsName(args){...};

在第一种情况下,定义了一个名为 showItems 的局部变量,并且 showItems 的定义被提升到顶部。后两种情况的区别在于,对于第三种情况,this.showItems.name 将为“showItemsName”,对于第二种情况,undefined 将为。此外,showItemsName 将是第三个函数的函数体内的局部变量,它保存对函数对象的引用。

关于Javascript:向我解释一下这个语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14104420/

相关文章:

javascript - 为什么js不允许方法作为对象键/值?

c++ - 使用帕斯卡三角形打印二项式系数

javascript - 使用 Angular JS 添加图像

javascript - 测试函数时未定义

javascript - console.log 中的逗号 (JavaScript)

c - VIM:某些 .c 文件打开时没有语法高亮显示

c++ - 如何在 C++ 中捕获无效输入?

mysql - 如何通过触发器减少另一个表中的值? (MySQL)

javascript - 如何从 JS Bin 中读取外部文件?

javascript - Plupload - 上传完成后的功能?