jQuery如何劫持“这个”?

时间:2010-02-05 00:17:35

标签: javascript jquery this

我只是想知道jQuery如何能够在Javascript中劫持'this'关键字。从我正在阅读的书中读到:“Javascript the Definitive Guide”它指出“this”是一个关键字,你不能像标识符那样改变它。

现在,假设您在自己的对象构造函数中,并且调用了一些jQuery代码,它是如何从您那里劫持的?

function MyObject(){
    // At this point "this" is referring to this object
    $("div").each(function(){
        // Now this refers to the currently matched div
    });
}

我唯一的猜测是,因为你提供了对jQuery each()函数的回调,所以你现在正在使用一个具有jQuery作用域链的闭包,而不是你自己的对象的作用域链。这是在正确的轨道上吗?

感谢

6 个答案:

答案 0 :(得分:16)

您可以通过使用this.call()调用函数的上下文(即.apply()值)并将预期的上下文作为第一个参数进行更改。

E.g。

function fn() {
    return this.foo;
}

fn.call({foo:123}); // => 123

注意:将null传递给callapply会使上下文成为global对象,或者在大多数情况下,window

值得注意.apply().call()之间的差异。前者允许您将一堆参数传递给它作为数组应用的函数,而后者允许您在上下文参数之后将它们作为常规参数添加:

someFunction.apply( thisObject, [1,2,3] );
someFunction.call( thisObject, 1, 2, 3 );

来自jQuery源

for ( var value = object[0];
      i < length &&
      callback.call( value, i, value ) // <=== LOOK!
      !== false;
      value = object[++i] ) {}

答案 1 :(得分:1)

它没有劫持任何东西 - 它只是确保“this”指向它想要的东西。查找可用于任何Javascript函数对象的标准“调用”函数。

答案 2 :(得分:1)

请参阅Function.apply的文档。第一个参数是“上下文”。它可以是任何物体。如果为null,则它将作为全局范围。

答案 3 :(得分:1)

JavaScript中的function类型有一个名为apply()的方法,它允许您指定绑定到哪个对象this。它的签名是:

apply(thisObj, arguments);

调用后,它会调用函数绑定thisthisObj并传递参数arguments

它通常用于:

function product(name, value)
{
  this.name = name;
  if (value > 1000)
    this.value = 999;
  else
    this.value = value;
}

function prod_dept(name, value, dept)
{
  this.dept = dept;
  product.apply(this, arguments);
}
prod_dept.prototype = new product();

// since 5 is less than 1000 value is set
var cheese = new prod_dept("feta", 5, "food");

// since 5000 is above 1000, value will be 999
var car = new prod_dept("honda", 5000, "auto");

答案 4 :(得分:1)

试试这个:

var MyObject = { "Test": "Hello world!" };
(function ()
{
    alert(this.Test); // Gives "Hello world!"
}).call(MyObject);

(function ()
{
    alert(this.Test); // Gives "Hello world!"
}).apply(MyObject);

(function ()
{
    alert(this.Test); // Gives "undefined"
})()

答案 5 :(得分:1)

function.apply()和function.call()允许您更改Javascript中this指向的内容。这里有一些方便的文章可以更详细地解释它 - Scope In JavascriptBinding Scope in Javascript