我正在为一些应用程序命名空间,我不了解命名空间中的范围。
(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";
答案 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
。因此,稍后更改foo
或bar
不会影响其他变量。
将它与PHP进行比较,我们可以使用特殊运算符reference实际分配变量:
$foo = 42;
$bar = &$foo;
$foo = 21;
echo $bar; // 21
应用于您的示例:
当您执行that.letter = letter
时,您正在将letter
的值复制到that.latter
。现在两个绑定都具有相同的值。
稍后当您分配letter = "B";
和that.letter = "C";
时,您要为变量和属性分配新值,现在它们具有不同的值。
我可能会遗漏您的问题,但我不知道该问题与this
或名称空间有什么关系。