有人可以解释编写这样的代码的意义吗?

时间:2017-08-24 07:18:27

标签: javascript angularjs

我看到了原始的angularjs代码,并且有很多像这样定义的函数

this.$get = function() {
    return function ngParamSerializer(params) {
        // some content...
    };
}

我不知道为什么......以及为什么需要它。一个返回函数的函数?它不会返回内部函数的结果吗?

为什么不写?

this.$get = function() {
    // some content...
}

示例:

this.$get = function() {
    return function ngParamSerializer(params) {
         return "Hello World"
    };
}

不一样
this.$get = function() {
    return "Hello World"
}

当你调用它时,你不会得到“Hello World”。$ get()??

3 个答案:

答案 0 :(得分:1)

从外观上看,您可能在提供商的代码中看到了这一点。

他们大多看起来像这样:

app.config(function ($provide) {
    $provide.provider('globalsetting', function () {
        this.$get = function () {
            var appname = "Lawyer App";
            return {
                appName: appname
            };
        }
    })
});

然后可以像这样使用:

app.controller("ProductController", function ($scope, globalsetting) {
    $scope.name = globalsetting.appName;
});

(借鉴Infragistics blog

的例子

现在想象一下这段代码有点复杂,您希望您的服务可以重复使用,但应用程序之间略有不同。像这样:

app.config(function ($provide) {
    $provide.provider('globalsetting', function () {
        this.$get = function (appAudience) {
            var appname = appAudience + " App";
            return {
                appName: appname
            };
        }
    })
});

但正如您在使用示例中所看到的,框架将调用$get,而不是您,因此您无法直接向其传递参数。所以你可以做的一件事就是返回一个函数(可以有参数,不像$get),而不是固定值:

app.config(function ($provide) {
    $provide.provider('globalsetting', function () {
        this.$get = function () {
            return {
                getAppName: function (appAudience) {
                    return appAudience + " App";
                }
            };
        }
    })
});

然后像这样使用它:

app.controller("ProductController", function ($scope, globalsetting) {
    $scope.name = globalsetting.getAppName("Lawyer");
    //$scope.name is now "Lawyer App"
});

看到你的示例代码返回带有params的函数,我猜你也是这个原因。但请注意,有more sophisticated ways for doing this

答案 1 :(得分:0)

当您不调用内部函数时,它可能会有所帮助,但您想在此函数中提供一些参数。

我不知道你的示例中$get函数是如何被angular使用的,所以我将从node.js express模块中提供一个示例。有中间件的概念。中间件是一个函数,它接受三个参数reqresnext和调用next函数,带/不带错误参数来停止/继续处理。中间件按照声明的顺序通过快递调用。

在下面的示例中,我想定义路由并添加身份验证逻辑以限制对资源的访问。如您所见auth接受userRole参数,并在快递调用middleware时使用该参数:

app.get('/user/:id', auth('admin'), getUser);

let auth = function(userRole) {
  return function(req, res, next) {
    if (userRole === 'admin') {
      return next();
    }
    return next(new Error('Auth error'));
  };
}

答案 2 :(得分:0)

在javascript函数中是真正的公民。您可以将函数分配给变量。

var f = function (a, b) {
    return a + b;
}

var f2 = f;

console.log (f(1,2)); // -> 3
console.log (f2(4,5)); // -> 9

第一个例子的意义是返回一个将由调用者调用的函数。这是一种回调

在您的情况下,您可以向$ get询问一个函数,稍后您可以使用参数调用

  var n = this.$get();
  for (var i = 0; i < 1000; i ++) {
     ...
     n(i, i*i);   // call function, e.g. notify others.
     ...
  }

直接返回n的结果显然不相同,因为这不允许传递参数。