对象上的作用域未按预期操作
Scope on Object not Behaving as Expected
我正在努力清除编码中长期存在的坏习惯:将小部件写入全局范围。
我在网页上为一个新闻卷制作了一个很大的、基本上是独立的脚本,在我把整个脚本塞进一个函数后,我对它的效果感到惊喜。。。事实上太好了。
为了确保我没有作弊,我写了以下代码来确保我的作用域是正确的:
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
声明为var
并将函数实例化为new
,Javascript在运行时将所述函数求值为对象(因此我们也可以删除底部对touch_roll()
的调用)。
校正后的输出如下:
THIS IS NOT A NUMBER
0
THIS IS NOT A NUMBER
因为您没有用new
调用touch_roll
,所以this
是window
对象(浏览器环境中的全局变量属于该对象)。
如果你使用new
,那么你会得到:
THIS IS NOT A NUMBER
THIS IS NOT A NUMBER
THIS IS NOT A NUMBER
此外,您还将touch_roll
声明为隐式全局变量。使用函数声明语法,或向其中添加var
。
相关文章:
- 监视函数从服务返回不起作用,但作用域函数起作用
- 将作用域存储在JSON中
- 从控制器继承了隔离的作用域以生成可重用的指令
- 从ng模板访问作用域
- 调用私有作用域
- 对父作用域的指令更新延迟了一步
- 正在$rootScope上达到控制器作用域$在内部控制器上
- 两个指令创建新的继承的和隔离的作用域-元素得到哪个
- 这两个关于 JavaScript 作用域链的例子有什么区别?
- 在具有命名作用域的自定义Polymer元素中隐藏表行
- AngularJS指令隔离作用域
- Angularjs:修改js中的作用域,稍后在页面中使用
- 访问多个指令的隔离作用域
- Javascript作用域和Ajax调用;工作不正常
- 对象上的作用域未按预期操作
- 控制器中的AngularJS数据绑定和在不同作用域上操作的模板
- 异步范围绑定回调中的JavaScript作用域操作不适用
- 无法在指令链接中操作继承的作用域(konami代码指令实现)
- 在执行ng-repeat和执行在HTML中没有反映的操作时,将作用域从HTML绑定到指令
- 如何将作用域键用于写操作?(范围限定的写键返回401未授权)