var arrayfunc = [function(){return this;}];
var func = arrayfunc[0];
arrayfunc[0](); //[function (){return this;}]
func(); //Window
我不知道为什么this
不一样?你帮我吗?
var arrayfunc = [function(){return this;}];
var func = arrayfunc[0];
arrayfunc[0](); //[function (){return this;}]
func(); //Window
我不知道为什么this
不一样?你帮我吗?
想想如下:
arrayfunc[0](); // this refer to arrayfunc
window['func'](); // this refer to window
即使通过arrayfunc[0] === func
return true,调用者也是不同的。
arrayfunc[0]();
通过对象调用函数arrayfunc
,
window['func']();
通过对象调用函数window
。
因为这是一个指向函数作用域的动态指针。例如,它不是 Java 中的固定引用。
这是一个常见的误解。当您为方法创建别名时 - 即,正如您所做的那样,将其提交给变量 - 了解您丢失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()
创建一个新函数但绑定到特定上下文 - 在您的情况下,它是从中获取的初始数组。