调用带或不带大括号范围问题的函数

meo*_*meo 0 javascript jquery

在jquery脚本中,我经常看到这样的函数:

var somefunction = function(){
  $(this).doseomething()
}

$(someelement).click( somefunction );
Run Code Online (Sandbox Code Playgroud)

在一些功能this接缝内部引用被点击的元素.如果使用大括号调用该函数,this则不会拒绝单击的元素.

我个人不喜欢它.我想看看我的代码中使用的东西是否是函数.我更愿意this作为论点传递.这是我到目前为止的方式:

var somefunction = function($clickedLink){
  $clickedLink.doseomething()
}

$(someelement).click(function(){ somefunction($(this)) });
Run Code Online (Sandbox Code Playgroud)

如果我不使用大括号,为什么我可以访问refared元素?一般来说,调用没有括号的函数是一种好习惯吗?它对性能有影响吗?

Nic*_*ver 6

它不是大括号,而是任何用作事件处理程序的函数,以及jQuery调用事件处理程序的方式(在vanilla JavaScript中也是如此),该函数的上下文将成为事件触发的元素.

为了在另一点上更清楚一点,你没有在没有括号的情况下调用函数,你正在传递对函数的引用.例如,这表示"这是事件发生时运行的功能":

$(someelement).click( somefunction );
Run Code Online (Sandbox Code Playgroud)

你有另一种方法做同样的事情,只是额外的匿名函数的开销更多:

$(someelement).click(function(){ somefunction($(this)); });
Run Code Online (Sandbox Code Playgroud)

function() { ... }你正在传递的是它(它是一个匿名函数,而不是你的命名函数).直到click事件确实somefunction调用为止.


你可以做到这一点无论哪种方式,但它们不是等价的,当你直接传递一个函数,this是元素和第一个参数是event对象 ...你经常需要停止传播或正确防止默认行为.