JavaScript命名空间和此/范围

时间:2015-03-05 22:54:13

标签: javascript

我正在为一些应用程序命名空间,我不了解命名空间中的范围。

(function (App) {
    App.Test = function(props){
        var that = this;

        var letter = "A";

        function init(){
            console.log("Round 1 ::::::::::::::::::::");
            console.log("     letter:",letter);
            console.log("that.letter:",that.letter);
            letter = "B";
            that.letter = "C";

            console.log("Round 2 ::::::::::::::::::::");
            console.log("     letter:",letter);
            console.log("that.letter:",that.letter);
        }
        function logLetters(){
        }
        this.letter = letter;
        init();
    };

})(window.App = window.App || {});

var app = new App.Test();

console.log("Round 3 ::::::::::::::::::::");
console.log(" app.letter:",app.letter);

输出

Round 1 ::::::::::::::::::::
letter: A
that.letter: A
Round 2 ::::::::::::::::::::
letter: B
that.letter: C
Round 3 ::::::::::::::::::::
app.letter: C

在第2轮中,为什么没有(letter === that.letter)

当我更新that.letter时,为什么不letter更新,反之亦然?

如果我想要"公开"我只需要用它声明它们吗?

this.letter = "A";

1 个答案:

答案 0 :(得分:3)

JavaScript是pass/call/assign by value。这意味着变量或属性将始终包含,但绝不包含对变量的引用。即为变量或属性分配新值不会更改另一个变量或属性的值(例外是全局范围和with范围,其中变量绑定连接到对象)。

示例:

var foo = 42;
var bar = foo;
foo = 21;
console.log(bar); // 42

bar 引用foo。而是将foo复制到bar。因此,稍后更改foobar不会影响其他变量。

将它与PHP进行比较,我们可以使用特殊运算符reference实际分配变量:

$foo = 42;
$bar = &$foo;
$foo = 21;
echo $bar; // 21

应用于您的示例:

当您执行that.letter = letter时,您正在将letter复制到that.latter。现在两个绑定都具有相同的值。

稍后当您分配letter = "B";that.letter = "C";时,您要为变量和属性分配新值,现在它们具有不同的值。

我可能会遗漏您的问题,但我不知道该问题与this或名称空间有什么关系。