this指向函数的调用者,也就是说它的值取决于函数被谁调用。举个例子,假设有如下代码:
function foo() {console.log(this);}foo();当我们运行上面的代码后,控制台将会输出全局对象(window)。这是因为foo函数是在全局作用域中被调用的,因此this指向全局对象。
但是,如果我们将代码稍微改一下:
var obj = {name: "John",foo: function() {console.log(this);}};obj.foo();此时控制台输出的值将是obj对象。这是因为foo函数是在obj对象的上下文中被调用的,因此this指向obj对象。
同样的道理,当函数作为一个对象的方法被调用时,this将会指向该对象。举个例子:
var obj = {name: "John",foo: function() {console.log(this.name);}};obj.foo();此时控制台将会输出John。因为this指向了obj对象,而name是obj对象的一个属性。
但是,如果我们将函数作为一个普通函数调用,this将会指向全局对象。比如下面这个例子:
function foo() {console.log(this);}var bar = {name: "John"};foo.call(bar);在上面的例子中,foo函数被call方法调用,并且传入了一个参数。这里的参数是一个对象,当call方法调用函数时,函数内的this就会指向该对象。因此控制台会输出{name: "John"}。
除了call方法,javascript还提供了apply和bind方法来显式地改变函数内this的指向。比如下面这个例子:
var obj = {name: "John",foo: function() {console.log(this.name);}};var bar = {name: "Mary"};var baz = obj.foo.bind(bar);baz();在上面的例子中,我们使用了bind方法来将obj.foo函数中的this指向了bar对象。因此控制台会输出Mary。
总结一下,this指的是函数被调用时的执行上下文。当函数作为对象的方法被调用时,this指向该对象。当函数被直接调用时,this指向全局对象。此外,我们还可以通过使用call、apply和bind方法来显式地改变this的指向。
上一篇:css拓展选择器
下一篇:javascript中.checked









