我有一个关于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。
在示例 1 中,someMethod 上下文捕获了 theThing 变量,对吗?
它可以捕获它,但它没有 - 您在console.log
调用中引用someMessage
而不是theThing
.但由于两者都是全局变量,因此无论如何它们都被函数封闭。
在示例 2 中,是否有循环引用?SomeMethod引用了originalThing,这是Thing。
同样,不,someMethod
只在someMessage
(和console
(关闭。replaceThing
抓住了theThing
,不过,这是一个真正的关闭例子。没有引用originalThing
,这是一个局部变量,它被初始化但随后无处使用,将尽快被丢弃。
除了基本的全局环境引用thingThing
引用someMethod
关闭全局环境之外,没有特定的循环引用。
我有一个简单的问题关于[内存泄漏]
此处的任何内容都不构成内存泄漏。
你是说范围?
如果调用theTing.someMethod()
,则theThing
在方法范围内且可访问。
此外,没有某种方法上下文。当我们谈论JavaScript中的上下文时,我们指的是this
。在theThing.someMethod
内,你确实可以访问theThing
的上下文(this
(。
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();