Knockout.js 敲除依赖注入

Knockout.js 敲除依赖注入,knockout.js,Knockout.js,我刚刚在一本优秀的KO手册中看到了一个在自调用函数中创建新类的示例,其方式不应污染全局名称空间。 我无法理解为什么他们将myApp当前名称空间发送到内部作用域,如果它存在于外部作用域中的话。据我所知,如果您向js函数发送一个对象,它将通过ref传递,因此任何更改都将反映在函数之外。那么为什么要将myApp“注入”到内部呢 window.myApp = {}; (function (myApp) { function Product() { var self = this;

我刚刚在一本优秀的KO手册中看到了一个在自调用函数中创建新类的示例,其方式不应污染全局名称空间。 我无法理解为什么他们将myApp当前名称空间发送到内部作用域,如果它存在于外部作用域中的话。据我所知,如果您向js函数发送一个对象,它将通过ref传递,因此任何更改都将反映在函数之外。那么为什么要将myApp“注入”到内部呢

window.myApp = {};
(function (myApp) {
    function Product() {
        var self = this;
        self.sku = ko.observable("");
        self.description = ko.observable("");
        self.price = ko.observable(0.00);
        self.cost = ko.observable(0.00);
        self.quantity = ko.observable(0);
    }
    myApp.Product = Product;
}} (window.myApp));

谢谢

我可以想出这些理由来确定变量的范围

让缩微器在函数内将变量替换为较短的名称。 如果全局变量被覆盖,请保留对原始对象的引用。 防止范围内的局部变量全局可访问,类似于2。 也就是说,在这个简单的案例中,这可能不是一个问题

例如,原因1:

window.myApp = {};
(function (x) {
    function Product() {
        var self = this;
        self.sku = ko.observable("");
        self.description = ko.observable("");
        self.price = ko.observable(0.00);
        self.cost = ko.observable(0.00);
        self.quantity = ko.observable(0);
    }
    x.Product = Product;
}} (window.myApp));
例如,原因2:

window.myApp = {};
(function (myApp) {
    myApp.counter = 0;

    function Product() {
        // removed for clarity.

        myApp.counter++;
    }

    // Code that depends on the myApp (global) varible. 
    // It will break if anyone overwrites the global variable.

    myApp.Product = Product;
}} (window.myApp));

window.myApp = {}; // Will break the scoped code if it wasn't scoped.
例如,原因3:

window.myApp = {};
(function (myApp) {
    var counter = 0;

    function Product() {
        // removed for clarity.

        counter++;
    }

    myApp.Product = Product;
}} (window.myApp));