为什么两个'这个'不一样?

时间:2012-08-15 07:53:51

标签: javascript

var arrayfunc = [function(){return this;}];
var func = arrayfunc[0];
arrayfunc[0]();    //[function (){return this;}]
func();            //Window

我不知道为什么this不相同?你帮我吗?

3 个答案:

答案 0 :(得分:3)

请想一想如下:

arrayfunc[0](); // this refer to arrayfunc
window['func'](); // this refer to window

即使通过arrayfunc[0] === func返回true,调用者也是不同的。

arrayfunc[0]();通过对象arrayfunc

调用了该函数

window['func']();通过对象window调用了该函数。

答案 1 :(得分:1)

因为这是指向函数范围的动态指针。例如,它不像Java中那样是固定引用。

答案 2 :(得分:1)

这是一种常见的误解。当您为方法创建别名时 - 即,就像您拥有的那样,将其提交给变量 - 了解您丢失了原始方法运行的this上下文。

例如:

var arr = [function() { alert(this[1]); }, 'hello'];
arr[0](); //'hello' - 'this' is the array
var func = arr[0];
func(); //undefined - 'this' is Window

第2行返回'hello',因为该方法在数组的上下文中运行 - 因为我们从其中调用

然而,第4行调用相同的方法,但是从我们设置的别名(func)的上下文中调用。这会重置其上下文,因此this指向默认值 - 在浏览器中,这意味着window

如果您想创建一个功能的快捷方式但保留其上下文,可以使用bind()(仅限ECMA5浏览器)执行此操作。

var func = arr[0].bind(arr);
func(); //'hello'

bind()创建一个新函数但绑定到特定上下文 - 在您的情况下,它是从中获取的初始数组。