0

我正在尝试改掉一个长期存在的编码坏习惯:将小部件写入全局范围。

我已经为网页上的新闻滚动制作了一个大型的、大部分是独立的脚本,并且在我将整个东西塞进一个函数之后,它的运行效果令人惊喜……事实上太好了。

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

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就是我想的那样吗?研究并没有真正帮助,但我有点筋疲力尽,所以完全有可能我读错了。如果不是这样,那么我如何将我的所有命名空间完全保留在该功能的范围内,以免与网站上的现有位混淆?


根据下面马特的回答,这里是更正的代码:

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为 avar并将函数实例化为newJavascript 将所述函数评估为运行时对象(因此我们也可以删除touch_roll()底部的调用)。

修正后的输出如下:

THIS IS NOT A NUMBER
0
THIS IS NOT A NUMBER
4

1 回答 1

4

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

If you were to use new, then you'd get:

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

Additionally, you're declaring touch_roll as a implicit global variable. Either use function declaration syntax, or add a var to it.

于 2012-07-10T10:43:15.913 回答