Javascript循环参考示例

时间:2018-06-04 10:57:36

标签: javascript memory-leaks

我有一个关于javascript循环引用的简单问题。

这是一个循环参考吗?

var theThing=null;

theThing = {
longStr: new Array(1000000).join('*'),
someMethod: function () {
  console.log(someMessage);
}

someMethod上下文捕获theThing变量吗?

示例2:

var theThing = null;
var replaceThing = function () {
var originalThing = theThing;

theThing = {
longStr: new Array(1000000).join('*'),
someMethod: function () {
  console.log(someMessage);
}
};
};
setInterval(replaceThing, 1000);

在示例2中,是否有循环参考? SomeMethod引用originalThing,这是Thing。

2 个答案:

答案 0 :(得分:0)

你的意思是范围?

如果您致电theTing.someMethod(),则theThing在范围内且可在该方法中使用。

此外,没有someMethod上下文。当我们在JavaScript中讨论上下文时,我们会引用this。在theThing.someMethod中,您确实可以访问this的上下文(theThing)。

var foo = "bar";

var obj = {
    name: "Lukas",
    method: function() {
        // scoped foo variable
        console.log(foo);
        // scoped obj variable
        console.log(obj.name);
        // context
        console.log(this.name);
    }
}

obj.method();

答案 1 :(得分:0)

  

在示例1中,someMethod上下文捕获了theThing变量吗?

could capture itit doesn't - 您在someMessage来电中引用了console.log而非theThing。但由于两者都是全局变量,所以无论如何它们都会被函数关闭。

  

在示例2中,是否有循环参考? SomeMethod引用originalThing,这是Thing。

同样,不,someMethod仅关闭someMessage(和console)。 replaceThing捕获theThing,这是关闭的真实例子。没有引用originalThing,这是一个初始化但随后无处使用的局部变量,会尽快被丢弃。

除了引用thingThing引用someMethod关闭全局环境的基本全局环境之外,没有特定的循环引用。

  

我有一个关于[内存泄漏]的简单问题

这里没有任何东西构成内存泄漏。