我正在尝试清理编码中长期存在的坏习惯:将小部件写入全局范围。
我为网页上的新闻滚动制作了一个大型的,大部分是自包含的脚本,并且在将整个内容填充到函数中之后,它对它的工作效果感到惊喜......实际上太好了。
为了确保我没有作弊,我编写了以下代码以确保我的范围是正确的:
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()
答案 0 :(得分:4)
因为您没有使用touch_roll
调用new
,this
是window
对象(这是浏览器环境中的全局变量所属)。
如果您使用new
,那么您将获得:
THIS IS NOT A NUMBER
THIS IS NOT A NUMBER
THIS IS NOT A NUMBER
此外,您将touch_roll
声明为隐式全局变量。使用function declaration syntax或向其添加var
。