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

我不知道为什么this不一样?你帮我吗?

4

3 回答 3

3

想想如下:

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

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

arrayfunc[0]();通过对象调用函数arrayfunc

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

于 2012-08-15T07:59:44.663 回答
1

因为这是一个指向函数作用域的动态指针。例如,它不是 Java 中的固定引用。

于 2012-08-15T07:55:11.700 回答
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()创建一个新函数但绑定到特定上下文 - 在您的情况下,它是从中获取的初始数组。

于 2012-08-15T08:00:17.853 回答