需要并避免污染全球范围

时间:2013-03-21 17:44:53

标签: javascript module requirejs

我想我不太了解Require.js,所以我想问为什么我可以改变firstName和lastName,如下例(全局)中那样。

不应该要求.js做有关避免污染全球范围的事情吗?我只是提供创建对象的界面,而不是改变它的内容。非常感谢。

// someModule.js
define([], function() {
    function Employee(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;        
    }

    Employee.prototype.getName = function() {
        return this.firstName = ' ' = this.lastName;
    }

    return {
        createEmployee: function(fName, lName) {
            return new Employee(fName, lName);
        };
    };
});

// main.js
require(['jquery', 'someModule'], function($, someModule) {
    $(function() {
        var x = someModule.createEmployee('John', 'Doe');
        document.write(x.getName() + '<br>');
        x.firstName = 'Some other name';
        x.lastName = 'Some other surname';
        document.write(x.getName());
    });
});

输出结果为:
约翰·多伊 其他一些姓氏其他姓氏

3 个答案:

答案 0 :(得分:2)

我认为你将全球泄密与财产的可见性混为一谈。 firstNamelastName并非泄露 - 它们只是公开可访问且可修改(可变)。如果你想隐藏它们,你可以这样做:

function Employee(firstName, lastName) {    
    this.getFirstName = function () { return firstName; };
    this.getLastName = function () { return lastName; };
}

Employee.prototype.getName = function () {
     return this.getFirstname() + ' ' + this.getLastName();
};

答案 1 :(得分:1)

你没有在这里规范任何全局范围 - 你的代码在匿名函数(闭包)内运行,没有任何东西绑定到窗口全局对象 - 所以没关系。

答案 2 :(得分:1)

您创建的对象具有“firstName”和“lastName”属性。您的代码没有阻止对这些属性的修改。

在较新的JavaScript实现中,有很多方法可以做到这一点,但是Requirejs不会自动执行(至少没有重大的重新设计或增强项目)。

具体来说,defineProperty方法允许您创建只读属性。现在,这将阻止所有代码修改属性。如果你想要对象控制的属性,你可以使用@ c24w在另一个答案中建议的技术。