什么's JavaScript数组中项目的作用域
What's the scope of an item in an JavaScript Array
我在JavaScript中玩作用域,我对从数组调用函数时遇到的一些问题很好奇。在下面的示例中,我使用三个不同的作用域。一个绑定到一个名为foobar的对象,一个绑定了window,然后第三个实际引用函数本身。我只是好奇为什么函数的作用域是它自己,而不是全局窗口对象。是因为数组访问本身就是一个函数调用,所以存储的函数在本地范围内吗?
var foobar = {
doWork: function() {
console.log('doing some work...');
console.log(this);
}
}
foobar.doWork(); // `this` will refer to foobar
var doWorkClone = foobar.doWork;
doWorkClone(); // `this` will refer to window
var workClones = [];
workClones.push(foobar.doWork);
workClones[0](); // `this` will refer to the doWork function itself
它们的行为方式相同。在a.b()
中,函数a.b
被调用,其中this
被设置为a
。
foobar.doWork(); // function is `foobar.doWork`, `this` is `foobar`
workClones[0](); // function is `workClones[0]`, `this` is `workClones`
这是因为.
和[]
表示法在功能上是相同的。使用哪一个并不重要,是否处理数组也不重要。
要理解这一点,首先,看看js是如何在后台工作的可能会很有帮助。
当您编写f(args)
时,js将执行f.call(this, args)
。因此,this
总是指从何处调用函数。
在您的情况下:
foobar.doWork() --> foobar
doWorkClone() --> window or wrapping expression
workClones[0]() --> "0" is in workClones, so workClones
相关文章:
- 监视函数从服务返回不起作用,但作用域函数起作用
- 将作用域存储在JSON中
- 从控制器继承了隔离的作用域以生成可重用的指令
- 从ng模板访问作用域
- 调用私有作用域
- 对父作用域的指令更新延迟了一步
- 正在$rootScope上达到控制器作用域$在内部控制器上
- 两个指令创建新的继承的和隔离的作用域-元素得到哪个
- 这两个关于 JavaScript 作用域链的例子有什么区别?
- 在具有命名作用域的自定义Polymer元素中隐藏表行
- AngularJS指令隔离作用域
- Angularjs:修改js中的作用域,稍后在页面中使用
- 访问多个指令的隔离作用域
- Javascript作用域和Ajax调用;工作不正常
- 向Angular作用域对象添加对象数组——TypeError
- ng重复中的ng模型-初始化唯一作用域属性
- 在put方法之前从作用域获取数据
- 什么's JavaScript数组中项目的作用域
- 回溯API: _ItemHierarchy作用域-忽略禁止的项目
- AngularJS -根据所选择的项目改变JSON中google maps指令的作用域