JavaScript函数声明

JavaScript函数声明,javascript,function-declaration,Javascript,Function Declaration,下面给出的JavaScript代码片段是某种函数声明吗?如果没有,请某人概述一下他们是什么 some_func = function(value) { // some code here } 及 一种方法是: var some_func = function(value) { // some code here } 另一种方式: function some_funct() { } var some_object={}; some_object["some_func"]

下面给出的JavaScript代码片段是某种函数声明吗?如果没有,请某人概述一下他们是什么

some_func = function(value) {
    // some code here
}

一种方法是:

var some_func = function(value) {  
    // some code here
}
另一种方式:

function some_funct() {
}
var some_object={};
some_object["some_func"] = function() {};
还有另一种方式:

function some_funct() {
}
var some_object={};
some_object["some_func"] = function() {};
或:

换句话说,在JS中声明函数有很多方法



您的第二个示例不正确。

第一个示例是分配给变量的函数声明(至少应该是这样,尽管它缺少第一个变量类型声明),第二个示例可能与对象声明有关。

它们被称为匿名函数;您可以在此处阅读更多关于它们的信息:

第一个是带有指定匿名函数的局部(或全局)变量

var some_name = function(val) {};
some_name(42);
第二个是指定了匿名函数的某个对象(或前面有标签的函数)的属性

var obj = {
    show: function(val) {},
    // ...
};
obj.show(42);
函数在JavaScript中是一流的公民,所以您可以将它们分配给变量,并从变量中调用这些函数

您甚至可以使用其他名称声明函数,而不是将该函数指定给的变量。例如,当您想要定义递归方法时,它非常方便,而不是:

var obj = {
    show: function(val) {
        if (val > 0) { this.show(val-1); }
        print(val);
    }
};
你可以写:

var obj = {
    show: function f(val) {
        if (val > 0) { f(val-1); }
        print(val);
    }
};

第一种方法是简单地创建一个匿名函数并将其分配给变量
some\u func
。因此,使用
some_func()
将调用该函数

var some_name = function(val) {};
some_name(42);
第二个应该是对象表示法的一部分

var obj = {
  show:function(value){
    // some code here
  }
};
因此,obj.show()将调用该函数


在这两种情况下,您都在创建一个匿名函数。但在第一种情况下,您只需将其分配给一个变量。而在第二种情况下,您将其指定为对象的成员(可能是许多其他对象)。

第一个示例创建一个名为
some_func
的全局变量(如果该名称的局部变量不存在),并为其指定一个函数,以便可以调用
some_func()

第二个示例是对象内部的函数声明。它指定一个函数作为对象的
show
属性的值:

var myObj = {
    propString: "abc",
    propFunction: function() { alert('test'); }
};

myObj.propFunction();
第一个

some_func = function(value) {  
    // some code here
}
正在声明一个变量并为其分配一个,这相当于

function some_func (value) {  
    // some code here
}
//pseudo code
class MyClass {
    function show (value) {
        // some code here
    }
}
obj = new MyClass();    // obj.show(value)
第二个应该是这样的

obj = {
    show:function(value){
       // some code here
    }
}
// obj.show(value)
相当于

function some_func (value) {  
    // some code here
}
//pseudo code
class MyClass {
    function show (value) {
        // some code here
    }
}
obj = new MyClass();    // obj.show(value)

干杯

有六种创建功能的方法/环境:

1) 标准声明性符号(具有C语言背景的人最熟悉)

其余都是函数表达式:

2) 作为对象文字的方法

var obj = {
    foo: function() {}
};
3) 作为实例化对象的方法(每次执行
new
时创建)

4) 作为原型的一种方法(仅创建一次,无论执行多少次
new

5) 作为带有引用的匿名函数(与#1的效果相同)*

6) 作为立即执行的匿名函数(完全匿名)


当我看这个陈述时,我考虑结果。因此,我不认为这些是匿名的,因为对函数立即创建了一个引用,因此不再是匿名的。但对大多数人来说都是一样的。

第二种形式有时用于对象文本:
some_obj={init:function(){},show:function(){}
some_object[“some_func”]=function(){}很麻烦。使用点表示法更简洁:
some_object.some_func=function(){}@Justin:。。。还有另一种声明函数的方法!声明是相同的(RHS),只是访问符号不同(LHS);)@贾斯汀:非常感谢你为我的贡献增加了精准度!
obj
上的外圆括号是多余的哦!在我的一篇关于使用模块模式编写代码的文章中,有人回复说,如果没有这些括号,有时匿名函数可能会失败。我仍然没有得到解释为什么。不确定它们是仅适用于模块模式还是所有匿名函数。这就是我添加它们的原因。我认为只有当你评估一个对象时,比如
eval(({a:1})”)
我认为@S.Mark是正确的。我从未见过你在另一篇文章中描述的问题。在它真正成为问题之前,我不会担心它。Dev1:“我们为什么要做abc?”Dev2:“……因为我们一直在做abc…”括号是立即调用的函数所必需的,而不是对象文本。函数声明和函数表达式不是一回事,关键是不能立即调用函数声明。例如,
(function(){})(
是一个自调用函数表达式;
function(){}
周围的括号是将其转换为函数表达式所必需的。否则,它被视为一个函数声明,缺少标识符(或者,如果提供了标识符,则以下
()
)将是一个语法错误。最后两个示例并不等效,因为您无法实例化对象文本(错误:“TypeError:obj不是构造函数”)
var Obj=function(){this.show=function(){};}
相当于您的伪代码。@Justin Johnson-Oh!真正地那么,为什么这项工作完美无瑕<代码>obj={show:function(value){alert(“work”);}}}obj.show()obj.show()
不起作用,我是说你的例子不一样。谢谢你的注意。如果这就是我想写的,我就不会回答真正的问题:有没有理由选择1或5?我在很多图书馆看到了#5,偶尔也会看到#1。没关系,我自己在这里找到了答案:认为#1和#5实际上是相同的,它们非常不同,这是误导。除了EsTeGe提供的链接外,还可以查看此SO问题的优秀答案,该答案很好地解释了差异:
var foo = function() {};
(function() {})();