需要了解Javascript对象引用

lea*_*ner 3 javascript

我正在看John Resig网站上的这段代码.我不明白的是当忍者对象被设置为空对象时,yell方法仍然可供武士使用.

是因为因为忍者周围还有一个参考,所以它不是垃圾收集的吗?

var ninja = {
  yell: function(n){
    return n > 0 ? yell(n-1) + "a" : "hiy";
  }
};


var samurai = { yell: ninja.yell };

ninja = {};

console.log(samurai.yell(2)); //hiy
Run Code Online (Sandbox Code Playgroud)

http://ejohn.org/apps/learn/#14 (原始来源,我修改了一点以删除命名函数表达式).

Rob*_*obG 5

在以下代码中:

var ninja = {
  yell: function(n){
    return n > 0 ? yell(n-1) + "a" : "hiy";
  }
};
Run Code Online (Sandbox Code Playgroud)

ninja.yell的值是对函数的引用.分配:

var samurai = { yell: ninja.yell };
Run Code Online (Sandbox Code Playgroud)

samurai.yell赋值,该值是对同一函数的引用(即ninja.yell引用的).然后:

ninja = {};
Run Code Online (Sandbox Code Playgroud)

ninja指定一个值,它是一个新的空对象.它对分配给samurai.yell的值没有影响,它仍然引用该函数.

变量有一个值,值有一个Type.有一种称为参考类型的特殊类型," ...用于解释诸如delete,typeof和赋值运算符之类的运算符的行为 ".因此,当对象位于赋值表达式中时,指定的值为"类型引用".

因此变量仍然有一个值,但它的值是一个参考.

  • 我认为值得注意的是`samurai.yell`指的是赋予`ninja.yell`_的函数,而不是指'ninja.yell`本身.您可以直接更改`ninja.yell`的值(不只是吹掉`ninja`对象)而不影响`samurai.yell` (2认同)