函数的this值由函数调用方式或使用Function.prototype.bind设置。
鉴于:
function CL(){
console.log(this); // a new object
protoFunc(this); // protoFunc doesn't exist on CL's scope chain and will throw an error
}
如果按如下方式调用 CL(并假设未使用bind ):
CL()
它的this值尚未设置,因此在非严格模式下进入函数时,它将被设置为全局(窗口)对象。在严格模式下,它将是undefined。
如果使用new调用 CL :
var cl = new CL()
那么函数中的this将引用一个新对象,就像由 一样创建new Object()
,即它是对实例的引用。由于这个新对象是默认返回的,并且在这里它被分配给cl,所以对构造函数的this的引用已经被保留,不需要保留任何其他引用。
请注意,对 CL 的每次调用都会创建一个全新的执行上下文。
如果您创建 CL 的实例,然后调用分配给构造函数原型的方法,例如:
cl.protoFunc()
那么protoFunc中的this将是cl。
您的声明:
调用protoFunc之前的函数上下文是CL的
没有意义,大概在这里您将“上下文”与“此”混淆了。如上所述,这是由调用(或绑定)设置的,因此您必须显示如何调用CL以确定这将是什么。
如何将函数上下文放入 protoFunc
鉴于构造函数中的this是实例,并且函数的this值由调用设置:
cl.protoFunc()
将完成这项工作。
语境
术语“上下文”已经作为this的化名进入 ECMAScript 行话,这是不幸的。ECMA-262 将执行上下文定义为在进入函数(或新的全局环境或使用 eval 时)时创建的环境,其中包括范围链和函数的所有变量,包括其this值。您不能引用执行上下文或以任何方式访问它。
所以一个函数的上下文不仅仅是this。