我正在尝试改掉一个长期存在的编码坏习惯:将小部件写入全局范围。
我已经为网页上的新闻滚动制作了一个大型的、大部分是独立的脚本,并且在我将整个东西塞进一个函数之后,它的运行效果令人惊喜……事实上太好了。
为了确保我没有作弊,我编写了以下代码以确保我的范围是正确的:
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
并将函数实例化为new
Javascript 将所述函数评估为运行时对象(因此我们也可以删除touch_roll()
底部的调用)。
修正后的输出如下:
THIS IS NOT A NUMBER
0
THIS IS NOT A NUMBER