【问题标题】:JavaScript function declarationJavaScript 函数声明
【发布时间】:2010-12-24 09:03:56
【问题描述】:

JavaScript 代码 sn-ps 是否在某种函数声明下方给出?如果不能,请概述一下它们是什么?

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

show:function(value){
   // some code here
}

【问题讨论】:

    标签: javascript function-declaration


    【解决方案1】:

    一种方法:

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

    另一种方式:

    function some_funct() {
    }
    

    另一种方式:

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

    或:

    var some_object={};
    some_object.some_func = function() {};
    

    换句话说,它们是在 JS 中声明函数的多种方式。


    你的第二个例子不正确。

    【讨论】:

    • some_object["some_func"] = function() {}; 很麻烦。使用点符号更简洁:some_object.some_func = function() {};
    • @Justin: ...还有另一种声明函数的方式!
    • 声明相同(右轴),只是访问符号不同(左轴);)
    • @Justin:非常感谢您为我的贡献增加了精确度!
    【解决方案2】:

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

    【讨论】:

    • 第二种形式有时用于对象字面量:some_obj = { init: function() {}, show: function() {} };
    【解决方案3】:

    它们被称为匿名函数;你可以在这里阅读更多关于它们的信息:

    http://www.ejball.com/EdAtWork/2005/03/28/JavaScriptAnonymousFunctions.aspx

    【讨论】:

      【解决方案4】:

      首先是具有指定匿名函数的局部(或全局)变量。

      var some_name = function(val) {};
      some_name(42);
      

      Second 是具有指定匿名函数的某个对象(或前面带有标签的函数)的属性。

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

      【讨论】:

        【解决方案5】:

        第一个是简单地创建一个匿名函数并将其分配给变量some_func。所以使用some_func()会调用函数。

        第二个应该是对象符号的一部分

        var obj = {
          show:function(value){
            // some code here
          }
        };
        

        所以,obj.show() 会调用函数

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

        【讨论】:

        • obj 的外括号是多余的
        • 哦!对我在 SO 中关于使用模块模式编写代码的一篇帖子的回复说,如果没有这些括号,有时匿名函数可能会失败。我仍然没有得到解释为什么。不确定它们是否仅适用于模块模式或所有匿名函数。这就是我添加它们的原因。
        • 我认为只有在评估 eval("({a:1})") 之类的对象时才会这样做
        • 我认为@S.Mark 是对的。我从未见过您在另一篇文章中描述的问题。在它真正成为一个问题之前,我不会担心它。开发人员 1:“我们为什么要做 abc?”开发 2:“....因为我们一直在做 abc...”
        • 括号对于立即调用的函数是必需的,而不是对象字面量。函数声明和函数表达式不是一回事,关键是不能立即调用函数声明。例如(function() {})()是一个自调用函数表达式; function(){} 周围的括号是将其转换为函数表达式所必需的。否则它被视为一个函数声明,缺少标识符(或者,如果提供了标识符,则以下())将是语法错误。
        【解决方案6】:

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

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

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

        【讨论】:

        • 哦。感谢您的关注。如果 that 本来就是我要写的,我就不会解决实际问题:D
        【解决方案7】:

        第一个...

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

        正在声明一个变量,并为其分配了anonymous function,相当于...

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

        第二个应该是这样的......

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

        相当于...

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

        干杯

        【讨论】:

        • 您的最后两个示例不等效,因为您无法实例化对象文字(错误:“TypeError:obj 不是构造函数”)。 var Obj = function() { this.show = function() {}; } 相当于你的伪代码。
        • @贾斯汀约翰逊 - 哦!真的吗?那么,为什么这个工作完美? obj={show:function(value){alert("work");}} obj.show();
        • 确实如此。我不是说obj.show()不行,我说你的例子不等价。
        【解决方案8】:

        创建函数有六种方式/上下文:

        1) 标准的声明式表示法(有 C 背景的人最熟悉)

        function foo() {}
        

        其余的都是函数表达式

        2) 作为对象字面量的方法

        var obj = {
            foo: function() {}
        };
        

        3) 作为实例化对象的方法(每次执行new 时创建)

        var Obj = function() {
            this.foo = function() {};
        };
        

        4) 作为原型的方法(只创建一次,不管new被执行多少次)

        var Obj = function() {};
        Obj.prototype.foo = function() {};
        

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

        var foo = function() {};
        

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

        (function() {})();
        

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

        【讨论】:

        猜你喜欢
        • 2011-12-05
        • 1970-01-01
        • 2015-12-03
        • 2018-03-23
        • 2013-10-10
        • 2012-06-17
        • 2010-12-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多