假设我有如下JavaScript代码
myClass = function(){ function doSomething(){ alert(this); // this1 } } alert(this); //this2
这两个“ this”对象是指什么?
this全局执行上下文中的值引用全局对象,例如:
this
this === window; // true
对于功能代码,实际上取决于您如何调用该功能,例如,在以下this情况下隐式设置该值:
调用没有 基础对象 引用的函数:
myFunc();
该this值还将引用全局对象。
调用绑定为对象属性的函数 :
obj.method();
该this值将参考obj。
obj
使用new运算符:
new
new MyFunc();
该this值将引用从继承的新创建的对象MyFunc.prototype。
MyFunc.prototype
另外,可以在调用函数时使用call或apply方法显式设置该值,例如:
call
apply
function test(arg) { alert(this + arg); } test.call("Hello", " world!"); // will alert "Hello World!"
call和之间的区别apply是apply,您可以使用Array或arguments对象正确传递任意数量的参数,例如:
arguments
function sum() { var result = 0; for (var i = 0; i < arguments.length; i++) { result += arguments[i]; } return result; } var args = [1,2,3,4]; sum.apply(null, args); // 10 // equivalent to call sum(1,2,3,4); // 10
如果第一个参数的值call或者apply是null或undefined,该this值将引用全局对象。
null
undefined
(请注意,将来这会随着ECMAScript 5的变化而改变,call并apply在thisArg不更改的情况下传递值)
thisArg