*的简短概述this
在 JavaScript 中执行函数时,默认this
值为window
.
function foo() {
console.log(this);
}
foo(); // => window
this
可以通过多种方式更改该值。一种方法是将函数作为对象的方法调用:
var x = {
foo: function() {
console.log(this);
}
};
x.foo(); // => This time it's the x object.
另一种方法是使用call
或apply
告诉函数在某个对象的上下文中执行。
function foo() {
console.log(this);
}
foo.call(x); // => x object again
foo.apply(x); // => x object as well
如果你call
或apply
在null
或undefined
,默认行为将再次发生:该函数将在上下文中执行window
:
function foo() {
console.log(this);
}
foo.call(null); // => window
foo.apply(undefined); // => window
但是,请注意,在 ECMAScript 5严格模式下,this
不默认为窗口:
(function() {
'use strict';
function foo() {
console.log(this);
}
foo(); // => undefined
foo.call(null); // => null
foo.apply(undefined); // => undefined
})();
您还可以在调用函数之前将其设置为this
将bind
函数绑定到对象:
function foo() {
console.log(this);
}
var bar = {
baz: 'some property'
};
var foobar = foo.bind(bar);
foobar(); // => calls foo with bar as this
结论
您正在使用此代码:
<a href="#" class="clickme" onclick="column_click()" title="my title">click me</a>
这意味着当点击链接时,它会执行column_click();
. 这意味着该column_click
函数将作为普通函数而不是方法执行,因为 (1) 它不是作为对象 ( someobject.column_click();
) 的属性调用的,(2) 它不是用call
or调用的apply
,(3) 它不是用 调用的bind
。由于它不是在严格模式下运行,因此默认this
为window
.
如何解决您的问题
因此,要解决您的问题,您可以简单地使用call
(或apply
) 来告诉函数在元素的上下文中执行。内小代码里面的属性值,this
指的是元素。所以我们可以使用column_click.call(this)
. 就这么容易!
<a href="#" class="clickme" onclick="column_click.call(this);" title="my title">click me</a>
但是,将元素作为参数传递可能更有意义:
<a href="#" class="clickme" onclick="column_click(this);" title="my title">click me</a>
并更改您的函数以接受参数:
function column_click(el) {
// Use el instead of this...
}
* 获得技术
this
在 JavaScript 中是动态作用域的。此行为不同于所有其他词法范围的变量。其他变量没有不同的绑定,具体取决于函数的调用方式;它们的范围来自它们在脚本中出现的位置。this
但是行为不同,并且可以具有不同的绑定,这取决于它在脚本中出现的位置,而取决于它的调用方式。这对于学习该语言的人来说可能是一个困惑的根源,但要成为一名熟练的 JavaScript 开发人员,掌握它是必要的。