Мне просто любопытно знать, как 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 и не цепочку объема Вашего собственного объекта. Это на правильном пути?
спасибо
Вы можете изменить контекст функции (т.е. значение 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] ) {}
попробуйте следующее:
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"
})()
function.apply () и function.call () позволяют изменить то, на что этот
указывает в Javascript. Вот пара удобных статей, которые объясняют это более подробно - Scope In Javascript и Binding Scope in Javascript
Он ничего не захватывает - он просто следит за тем, чтобы «это» указывало на то, что оно хочет. Найдите стандартную функцию «вызова», доступную для любого объекта функции Javascript.
См. Документацию для Function.apply
. Первый параметр - это «контекст». Это может быть любой объект. Если null, он будет иметь глобальную область видимости.
Тип 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");