对象的范围不符合预期

时间:2012-07-10 10:40:47

标签: javascript scope

我正在尝试清理编码中长期存在的坏习惯:将小部件写入全局范围。

我为网页上的新闻滚动制作了一个大型的,大部分是自包含的脚本,并且在将整个内容填充到函数中之后,它对它的工作效果感到惊喜......实际上太好了。

为了确保我没有作弊,我编写了以下代码以确保我的范围是正确的:

var story_count = "THIS IS NOT A NUMBER";

console.log(story_count);

touch_roll = function()
{
    this.story_count = 0;
}

console.log(story_count);

touch_roll();

console.log(story_count);

完全希望在控制台中产生以下响应

THIS IS NOT A NUMBER
THIS IS NOT A NUMBER
THIS IS NOT A NUMBER

我完全惊讶地发现输出实际上是这个

THIS IS NOT A NUMBER
THIS IS NOT A NUMBER
0

this不是我认为的吗?研究并没有真正帮助,但我有点倦怠,所以完全有可能我读错了。如果不是这样,那么如何将我的所有命名空间完全保留在该函数的范围内,以免混淆网站上的现有位?


根据Matt在下面的回答,这里是更正后的代码:

var story_count = "THIS IS NOT A NUMBER";

console.log(story_count);

var touch_roll = new function()
{
    this.story_count = 0;
    console.log(story_count);
}

console.log(story_count);

通过将touch_roll声明为var并将函数实例化为new Javascript将所述函数作为运行时计算为对象(因此我们也可以删除对{{1}的调用在底部)。

更正的输出如下:

touch_roll()

1 个答案:

答案 0 :(得分:4)

因为您没有使用touch_roll调用newthiswindow对象(这是浏览器环境中的全局变量所属)。

如果您使用new,那么您将获得:

THIS IS NOT A NUMBER
THIS IS NOT A NUMBER
THIS IS NOT A NUMBER

此外,您将touch_roll声明为隐式全局变量。使用function declaration syntax或向其添加var