这里是 JS 新手,我最近一直在查看一些代码,其中使用的语法我不太熟悉。这是一个示例,后面是我的问题:
function Group(args) {
this.showItem = showItem;
function showItem(args) {
...
}
}
var group = new Group (args);
问题:
据我了解,创建
function Group
然后通过group = new Group
实例化本质上相当于定义一个类然后实例化该类的对象的原型(prototype)类(class)。这是正确的吗?关于
Group
的属性(方法?),上面的showItem
调用的语法是什么?为什么不直接定义它:this.showItem = function(args){...};
将代码更改为上述内容是否会改变任何不同的行为?
如果您按照上面的方式定义了它,那么该语法称为什么?
最佳答案
Group
函数被用作构造函数;你的直觉基本上是正确的。没有充分的理由不使用像
this.showItem = function(args){...};
这样的匿名函数表达式,除非您想要重用局部变量showItem
。我不确定您指的是哪种语法。
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/