Javascript范围根据您传递回调函数的方式而有所不同

时间:2015-10-09 11:18:49

标签: javascript

function DoSomething()
{
     var scope = this;
}

考虑以下调用它的方法: 选项1:

var self= this;
$someElement.change(self.DoSomething);

选项2:

var self= this;
$someElement.change(function(){self.DoSomething();});

为什么触发更改事件时,第一行代码导致scope成为触发事件的元素,但第二行导致scope相同作为self,但第二个?

由于我不明白这里的概念,因此谷歌很难找到正确的搜索词。

1 个答案:

答案 0 :(得分:0)

jQuery在原始元素的上下文中调用给定的函数。

选项1:

您已将self.DoSomething作为一项功能通过 jQuery将在self.DoSomething

的上下文中调用$someElement

执行以下代码:

var self = this;
self.DoSomething.call($someElement);

function DoSomething()
{
    // this = $someElement
    var scope = this;
}
DoSomething this内的

等于被叫方 - $someElement

选项2:

您已将匿名函数作为函数传递。
jQuery将在$someElement

的上下文中调用匿名函数
var self = this; 
function() {
    self.DoSomething();
}.call($someElement);

function() {
    // this = $someElement, as well
    self.DoSomething(); // LOOK! You call self's method. Not within any context
}

function DoSomething()
{
    // default function call, default this is presented
}