静态函数声明与Javascript中的普通函数声明之间的区别?

时间:2017-08-09 14:57:51

标签: javascript ecmascript-6 frontend static-methods es6-class

有很多方法可以在javascript中声明一个函数。 其中一种方法是声明一个类和一个静态函数,如下所示。

class className {
 static fucntionName() {
 }
}

另一种宣告方式是通过传统的javascript风格,如下所示。

export function functionName() {
}

我想知道使用其中任何一种情况的优点/缺点。 是否有静态方法的特定用例,为什么声明一个类(我们知道在javascript中没有必要实例化该类以访问静态函数)。 为什么不在所有/任何用例中使用函数声明的传统方式(上例中的第二种情况)?

我想了解这是详细的。

4 个答案:

答案 0 :(得分:1)

  

我想知道使用其中任何一种情况的优点/缺点。

苹果和橘子。不必导出类,模块也不必是类。它们不是一回事,虽然导出的模块可以是一个类。

  

静态方法是否有任何特定用例

当你想要一个类提供一些功能时,但是这不是什么?特定于该类的单个实例的东西。像var c = Point.interpolate(a, b, .5);一样 静态interpolate函数不属于它正在操作的任何点。在提供此功能的类(插值点)上定义此函数静态更合适。

  

我们知道在javascript中没有必要实例化该类以访问静态函数

这是静态函数的定义,您不必实例化该类来调用它。这不是JS特有的。

  

为什么不在所有/任何用例中使用函数声明的传统方式(上例中的第二种情况)

因为在我开始时,课程和模块必然是相同的。编写

更好/更清晰
class Foo{
    ...
    static fn(){...}
}

大于

class Foo {
    ...
}

Foo.fn = function(){...};

虽然最后两者都只是

function Foo(){...}
Foo.fn = function(){};
// + Foo.prototype stuff

但是类语法更清晰。即使您只是扫描这段代码,也可以更容易阅读和理解。

答案 1 :(得分:0)

正如您所知,static方法可以从类本身调用。

static方法可以从类的实例调用,因此您基本上必须先创建一个对象才能访问该方法。

例如,对于addNumbers(var a, var b) return a+b,是否真的有必要浪费内存实例化类的对象只是为了添加这两个数字?不,你只需要结果,这就是静态的重点。

使用第一种样式允许您对特定类中的方法进行分组(考虑名称空间等)。也许你可以定义像MathString这样的类,它们都有add方法,但是以不同的方式实现。单独调用add()会让人感到困惑,但Math.add()String.add()不是。

另一方面,export风格完全不同。它允许您使用其他模块中的函数。

想一想:

<强> first_module.js

function cube(var x) {
    return x * x * x;
}

<强> second_module.js

import { cube } from 'first_module'; // <-- ERROR
alert( cube(3) ); // <-- Undefined function

但是,如果你以这种方式声明first_module:

export function cube(var x) {
    return x * x * x;
}

然后second_module将正常工作。

答案 2 :(得分:0)

  

什么是静态功能?

在类中声明静态函数会创建一个类级别函数,该函数不能由该函数的实例调用。一个例子是Object.assign函数。静态函数通常用于构建对定义它的类型的实例进行操作的函数。

答案 3 :(得分:0)

静态方法只能在类中调用,并且对于实用程序函数很有用,例如,按摩正在进入的参数变量,或者设置常量(或者前面提到的Object.assign),必须这样做每次,在传递给类的实例之前,以避免不必要的使用记忆,如前一位评论员指出的那样。

清理完所有内容后,您可以导出函数的其余部分,以便在代码中的其他地方进行实例化,其中参数将被清除/常量设置,每次使用该类时都会反复执行,并且您的实例化可以专注于动态的东西。