var arrayfunc = [function(){return this;}];
var func = arrayfunc[0];
arrayfunc[0](); //[function (){return this;}]
func(); //Window
我不知道为什么this
不相同?你帮我吗?
答案 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()
创建一个新函数但绑定到特定上下文 - 在您的情况下,它是从中获取的初始数组。