0

我经常在 JavaScript 中看到如下代码:

func1: function() {
      return array1.pop();
    }

上面和这样的有什么区别:

function func1 (){
         return array1.pop();
}

以上两个是同一个东西,不同的写法吗?第一个对我来说看起来像是一个 switch 语句。对不起,如果这个问题太简单了,但是如果这只是语法问题的话,JavaScript 书籍很少使用第一种语法;我在 StackOverflow 中问这个问题的主要原因。

4

3 回答 3

2

第一个是在对象文字上创建一个属性。属性名称是func1,属性值是匿名函数。例如:

var someObject = {
    someProp: function () { 
        alert('foo'); 
    }
};

someObject.someProp(); // alerts "foo"

对于第二个,您可能指的是function func1 ...,这是一个普通的旧函数声明。例如:

function someFunction() {
    alert('foo');
}

someFunction(); // alerts "foo"

大多数人使用对象文字作为将逻辑功能组合在一起的一种方式,类似于其他语言中的命名空间。通过将函数定义为其他变量的属性,您可以减少全局命名空间中的变量数量,并使代码更有条理。

于 2013-08-13T12:34:52.187 回答
1

第二种形式是“普通”函数声明的形式:该函数在您声明它的范围内可用。第一种形式在对象字面量中使用:

var myObject = {
    func: function() {
        return array1.pop();
    },
    name: 'John Smith'
};

myObject.func()只要可以访问,就可以调用该函数myObject。除了范围的差异之外,函数的两个定义是等价的。

于 2013-08-13T12:37:18.057 回答
1

还有一个非常重要的区别称为“功能提升”(在ECMA方面含糊不清,但是描述行为的常用术语)。这与原始问题中的“第二种方式”直接相关,即 -

function func1 (){
         return array1.pop();
}

我们可以通过两种方式使用函数(同样是第二种方式):

  1. 作为函数表达式 -

    var a = 函数() {

    }

  2. 作为函数声明

    函数 a() {

    }

如您所知,所有变量,无论它们在函数体中的哪个位置声明,都会在幕后被提升到函数的顶部。这同样适用于函数,因为它们只是分配给变量的对象。唯一的“陷阱”是当使用函数声明时,函数的定义也会被提升,而不仅仅是它的声明。

于 2013-08-13T13:01:15.827 回答