1

这有点时髦。但是看看下面的代码片段:

$('.classname').bind('click', somefunction);

function somefunction() {
  console.log($(this)); // **displays[<div>,context<div>]**
}

如果我将上述内容调整为:

$('.classname').bind('click', function(){ somefunction(); });

function somefunction(){
  console.log($(this)); // **displays [Window]**
}

我不太清楚为什么“this”会根据函数的回调方式假设两个不同的值。问题是,我确实需要这个,上下文和要调用的函数

function(event){ somefunction(event); }

因为我需要这个活动。但不太确定这里有什么。

任何线索,人们?

4

4 回答 4

2

this是函数的接收者。

当您执行obj.someFunction()时,它obj在执行内部。

但是,如果您使用该函数并在没有显式接收器的情况下执行它(并且它没有被绑定),那么它就是全局范围,即window

function someFunction(){
    console.log(this);
}
var f = obj.someFunction;
f(); // log the window

请注意,您可以使用bind绑定函数:

 var f = obj.someFunction.bind(obj);
 f(); // log the obj

但通常的解决方案是使用闭包,即另一个函数,嵌入你想要的这个:

var f = function(){obj.someFunction()};
f(); // log the obj

这就是为什么你经常在 jquery 回调中看到这个结构:

$(someselector).click(function(event){
    $(this).someFunction(event)
 }); // this is $(this) and the event is received
于 2012-11-18T19:41:04.947 回答
1

“我不太清楚为什么'this'会根据函数的调用方式假设两个不同的值......”

这正是thisJavaScript 中的工作原理。它的值取决于函数的调用方式。


.call您可以使用或手动将其设置为您想要的值.apply

$('.classname').bind('click', function(event){ 
                                  somefunction.call(this, event); 
                              });

现在无需修改somefunction. 通过使用 调用它.call(),您可以手动将this值设置为作为第一个参数传递的任何值。

于 2012-11-18T19:50:16.013 回答
0

该事件也在第一个示例中传递

$('.classname').bind('click', somefunction);

function somefunction(e) {
  // e is the event here as well..
  console.log($(this)); // **displays[<div>,context<div>]**
}
于 2012-11-18T19:46:32.293 回答
0
$('.classname').bind('click',somefunction);

表示“运行somefunction()”将作为.$('.classname')$('.classname')this

$('.classname').bind('click',function(){somefunction();});

$('.classname')表示“在您的匿名函数$('.classname')中运行此匿名函数” this,但是当您somefunction()在匿名函数内部调用时,this不会传递给它。你可以解决这个问题。

$('.classname').bind('click', function(){ somefunction(this); });

function somefunction(x){
  console.log($(x));
}
于 2012-11-18T19:49:51.760 回答