数组中函数的上下文是什么
What is the context of a function in an array?
我相信我应该知道答案,但要么我只是愚蠢,要么我以前从未遇到过。。。
给定以下数组,在全局范围中声明:
var arr = [function() {
console.dir(this);
}];
我本来希望this
引用Window对象。但是,当调用函数时:
arr[0](); //Logs Array
看起来this
实际上指的是数组。然后,当我在另一个变量中存储对该函数的引用并调用它时,this
确实引用了Window对象:
var func = arr[0];
func(); //Logs Window
那么,为什么函数的上下文会发生变化呢?这是一把小提琴,用来演示上面两种情况。
当您调用函数作为对象的属性时,例如obj.func()
,this
指的是obj
这正是你在这里所做的。arr
是您的对象,0
是持有函数的属性。
注意:毕竟,数组只是对象,其元素是其属性的值(尽管属性通常是数字字符串(所有属性都是字符串))。
请参阅MDN-this
了解更多信息,在这种情况下:
当函数被调用为对象的方法时,其
this
被设置为该方法调用的对象
在第二种情况下,您将函数称为"standalone",因此this
指的是window
。如果代码是在严格模式下运行的,那么this
将是undefined
。
这是因为this
关键字实际上是一个运算符,它返回对调用它的函数的持有者(或所有者)的引用。由于在第一种情况下,持有者是一个数组(它是一个对象),所以它返回一个数组。在第二种情况下,支架是窗口对象。
有关更多详细信息,请参阅本文。
注意:
在JavaScript中,this
总是指函数所有者
你可以在怪癖网站上读到更多关于它的信息。
因为元素是数组的成员,并且this
总是指向所有者对象(除非您使用bind()
/call()
/apply()
等)。如果您不是对象的一部分,this
将是全局对象;即浏览器环境中的CCD_ 22。例外情况是,如果您处于严格模式,其中this
将是undefined
。
你所做的实际上与相同
var ar = {
'0' : function () {
console.dir(this);
}
}
ar[0]();
var func = ar[0];
func();
这在概念上可能更有意义。
http://jsfiddle.net/TVtwr/1/
- 这是什么 ==- javascript 运算符
- 在上下文菜单项单击上显示侧边栏/弹出窗口的最佳方法是什么
- 当作为脚本运行时.js Node中“this”的上下文是什么
- Node.js:在模块作用域中使用“this”运算符的上下文是什么
- AMD:JavaScript上下文的目的是什么
- JavaScript 中操作的“上下文”是什么意思
- 数组中函数的上下文是什么
- 更改函数的目的是什么's在javascript中的上下文
- TypeScript:告诉外部函数当前的上下文是什么
- 在jQuery中使用带有上下文节点的子选择器的新方法是什么?
- 使用jQuery选择器时的默认上下文是什么?
- 自定义元素's绑定上下文-它到底是什么,如何访问父VM
- 在设置上下文时,使用bind的替代方法是什么?
- 将ES7异步回调绑定到父作用域上下文的最简洁的方法是什么?
- Javascript:使用函数上下文与作为参数传递的好处是什么?
- nodejs文件中函数的上下文是什么?
- Q.js,承诺,类和this,上下文是什么
- 当 && 在 Javascript 中,当它在 if 语句之外时是什么意思?(里面的上下文)
- 在 constructor() 中绑定许多 React 组件方法的上下文的正确约定是什么?
- Javascript 在控制台中工作,但不在脚本标签内工作.控制台的上下文是什么