AngularJS Foundations

Constant vs Value

区别一:value可以被修改,constant一旦声明无法被修改

    $provide.decorator('pageCount', function($delegate) { return $delegate + 1; });

区别二:value不可在config里注入,constant可以

var app = angular.module('app', []);

app.value('myValue', 1);
app.value('myConstant', 1);

// 正确

app.config(config);

myConfig.$inject = ['myConstant'];

function myConfig(myConstant) {

}

// 错误

app.config(config);

myConfig.$inject = ['myValue'];

function myConfig(myValue) {

}
`

透过源码看原理

function provider(name, provider_) {
    if (isFunction(provider_)) {
        provider_ = providerInjector.instantiate(provider_);
    }
    if (!provider_.$get) {
        throw Error('Provider ' + name + ' must define $get factory method.');
    }
    return providerCache[name + providerSuffix] = provider_;
}
function factory(name, factoryFn) {
    return provider(name, {
        $get: factoryFn
    });
}
function service(name, constructor) {
    return factory(name, ['$injector', function($injector) {
        return $injector.instantiate(constructor);
    }]);
}
function value(name, value) {
    return factory(name, valueFn(value));
}
function constant(name, value) {
    providerCache[name] = value;
    instanceCache[name] = value;
}
function decorator(serviceName, decorFn) {
    var origProvider = providerInjector.get(serviceName + providerSuffix),
        orig$get = origProvider.$get;
    origProvider.$get = function() {
        var origInstance = instanceInjector.invoke(orig$get, origProvider);
        return instanceInjector.invoke(decorFn, null, {
            $delegate: origInstance
        });
    };
}

参考

http://hellobug.github.io/blog/angularjs-providers