当jQuery调用函数作为引发事件的事件处理程序时,jQuery以某种方式能够在它调用的函数的上下文中定义“this”。在下面的示例中,jQuery将其定义为单击的dom元素。
<input id="someButton" type="button" value="click me!"/>
<script type="text/javascript">
$("#someButton").click(EventHandler);
function EventHandler()
{
alert($(this).attr("id")); //This raises an alert message "someButton"
}
</script>
jQuery如何做到这一点?我想为我自己的自定义框架复制这种行为。
答案 0 :(得分:3)
Function
有两种方法可供您使用:call和apply。使用这两个方法,将要用于this
的对象作为第一个参数传递。使用call
,其他参数将逐个传递:
functionName.call(this, arg1, arg2);
使用apply
,传入一个参数数组:
functionName.apply(this, [arg1, arg1]);
或者,您可以传递一个实际的参数对象:
function someFunction ()
{
functionName.apply(this, this.arguments);
}
答案 1 :(得分:2)
您可以使用call
或apply
JavaScript方法:
function myFunction() {
// you want "this" to be your element
}
var element = SOMEDOMELEMENT;
myFunction.call(element, /* add other comma-separated arguments here, if any */);
myFunction.apply(element, /* add an array of arguments here, if any */);
当使用call和apply时,它会将函数内的上下文(this
)更改为您想要的任何元素。
答案 2 :(得分:0)
不确定jQuery使用的是什么,但有一个bind
函数:
var regularFunc = function() {
console.log(this);
};
var boundFunc = regularFunc.bind(123);
regularFunc(); // logs whatever 'this' is at time it is called (e.g. 'window')
boundFunc(); // logs 123 at all times since that is specified to be 'this'
答案 3 :(得分:0)
全部关闭。
Javascript在定义this
等变量时会使用闭包。
所以你可以做以下事情:
var myFuncs = {
func1: function(){
this.func2 = function() { alert('hello');}
return this;
},
func2: function(){alert('HI')}
}
所以,如果你这样做:
myFuncs.func1().func2(); // alerts 'hello'
,而:
myFuncs.func2(); // alerts 'HI'
答案 4 :(得分:0)
普通的旧javascript / html也可以。
<button id='something' onclick='alert(this.id);'>Click me</button>