Как jQuery угоняет “это”?

Мне просто любопытно знать, как jQuery может угнать 'это' ключевое слово в JavaScript. Из книги я читаю: "JavaScript, Полное руководство" это указывает, что "это" - ключевое слово и Вы не можете измениться, это как Вы может с идентификатором.

Теперь, скажите, что Вы находитесь в своем собственном конструкторе Object, и Вы звоните некоторому коду jQuery, как может это для угона этого от Вас?

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

Мое единственное предположение было бы то, что, так как Вы предоставляете обратный вызов jQuery каждый () функция, Вы теперь работаете с закрытием, которое имеет цепочку объема jQuery и не цепочку объема Вашего собственного объекта. Это на правильном пути?

спасибо

8
задан D.C. 5 February 2010 в 00:17
поделиться

6 ответов

Вы можете изменить контекст функции (т.е. значение this ), вызвав ее с помощью .call () или .apply () и передав предполагаемый контекст как первый аргумент.

Например.

function fn() {
    return this.foo;
}

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

Примечание: передача null либо call , либо apply делает контекст глобальным объектом или, в большинстве случаев, окно .

Вероятно, стоит отметить разницу между .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] ) {}
16
ответ дан 5 December 2019 в 07:58
поделиться

попробуйте следующее:

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"
})()
1
ответ дан 5 December 2019 в 07:58
поделиться

function.apply () и function.call () позволяют изменить то, на что этот указывает в Javascript. Вот пара удобных статей, которые объясняют это более подробно - Scope In Javascript и Binding Scope in Javascript

1
ответ дан 5 December 2019 в 07:58
поделиться

Он ничего не захватывает - он просто следит за тем, чтобы «это» указывало на то, что оно хочет. Найдите стандартную функцию «вызова», доступную для любого объекта функции Javascript.

1
ответ дан 5 December 2019 в 07:58
поделиться

См. Документацию для Function.apply . Первый параметр - это «контекст». Это может быть любой объект. Если null, он будет иметь глобальную область видимости.

1
ответ дан 5 December 2019 в 07:58
поделиться

Тип function в JavaScript имеет метод под названием apply () , который позволяет указать к какому объекту привязан этот . Его подпись:

apply(thisObj, arguments);

После вызова он вызывает функцию, связывающую this с thisObj и передающую аргументы 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");
1
ответ дан 5 December 2019 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: