Baseline Widely available
Ðоведение клÑÑевого Ñлова this
в JavaScript неÑколÑко оÑлиÑаеÑÑÑ Ð¿Ð¾ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð¾ÑÑалÑнÑми ÑзÑками. ÐмеÑÑÑÑ Ñакже ÑазлиÑÐ¸Ñ Ð¿Ñи иÑполÑзовании this
в ÑÑÑогом и неÑÑÑогом Ñежиме.
РболÑÑинÑÑве ÑлÑÑаев знаÑение this
опÑеделÑеÑÑÑ Ñем, каким обÑазом вÑзвана ÑÑнкÑиÑ. ÐнаÑение this
не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑÑановлено пÑÑÑм пÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ð¾ вÑÐµÐ¼Ñ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð° и Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ñазное знаÑение пÑи каждом вÑзове ÑÑнкÑии. Ð ES5 пÑедÑÑавлен меÑод bind()
, коÑоÑÑй иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿ÑивÑзки знаÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑевого Ñлова this незавиÑимо Ð¾Ñ Ñого, как вÑзвана ÑÑнкÑиÑ
. Также в ES2015 пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ ÑÑÑелоÑнÑе ÑÑнкÑии
, коÑоÑÑе не ÑоздаÑÑ ÑобÑÑвеннÑе пÑивÑзки к this
(они ÑоÑ
ÑанÑÑÑ Ð·Ð½Ð°Ñение this
лекÑиÑеÑкого окÑÑжениÑ, в коÑоÑом бÑли ÑозданÑ).
const test = {
prop: 42,
func: function () {
return this.prop;
},
};
console.log(test.func());
// Expected output: 42
СинÑакÑÐ¸Ñ ÐнаÑение
СвойÑÑво конÑекÑÑа вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð° (global, function или eval), коÑоÑое в неÑÑÑогом Ñежиме вÑегда ÑвлÑеÑÑÑ ÑÑÑлкой на обÑекÑ, а в ÑÑÑогом Ñежиме Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð»Ñбое знаÑение.
Global конÑекÑÑРглобалÑном конÑекÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ (за пÑеделами какиÑ
-либо ÑÑнкÑий) this
ÑÑÑлаеÑÑÑ Ð½Ð° глобалÑнÑй обÑÐµÐºÑ Ð²Ð½Ðµ завиÑимоÑÑи Ð¾Ñ Ñежима (ÑÑÑогий или неÑÑÑогий).
// РбÑаÑзеÑаÑ
, обÑÐµÐºÑ window Ñакже ÑвлÑеÑÑÑ Ð¾Ð±ÑекÑом global:
console.log(this === window); // true
a = 37;
console.log(window.a); // 37
this.b = "MDN";
console.log(window.b); // "MDN"
console.log(b); // "MDN"
ÐÑимеÑание: ÐÑ Ð²Ñегда можеÑе легко полÑÑиÑÑ Ð¾Ð±ÑÐµÐºÑ global, иÑполÑзÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»Ñное ÑвойÑÑво globalThis
, незавиÑимо Ð¾Ñ ÑекÑÑего конÑекÑÑа, в коÑоÑом вÑполнÑеÑÑÑ Ð²Ð°Ñ ÐºÐ¾Ð´.
РпÑеделаÑ
ÑÑнкÑии знаÑение this
завиÑÐ¸Ñ Ð¾Ñ Ñого, каким обÑазом вÑзвана ÑÑнкÑиÑ.
ÐоÑколÑÐºÑ ÑледÑÑÑий код не в ÑÑÑогом Ñежиме
, и знаÑение this
не ÑÑÑанавливаеÑÑÑ Ð²Ñзовом, по ÑмолÑÐ°Ð½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð¾Ð±ÑÐµÐºÑ global, коÑоÑÑм в бÑаÑзеÑе ÑвлÑеÑÑÑ
.window
function f1() {
return this;
}
// РбÑаÑзеÑе:
f1() === window; // window - глобалÑнÑй обÑÐµÐºÑ Ð² бÑаÑзеÑе
// Ð Node:
f1() === global; // global - глобалÑнÑй обÑÐµÐºÑ Ð² Node
Ð ÑÑÑогом Ñежиме, еÑли знаÑение this
не ÑÑÑановлено в конÑекÑÑе вÑполнениÑ, оно оÑÑаÑÑÑÑ undefined
, как показано в ÑледÑÑÑем пÑимеÑе:
function f2() {
"use strict"; // Ñм. strict mode
return this;
}
f2() === undefined; // true
ÐÑимеÑание: Ðо вÑоÑом пÑимеÑе this
должно имеÑÑ Ð·Ð½Ð°Ñение
, поÑÐ¾Ð¼Ñ ÑÑо ÑÑнкÑÐ¸Ñ undefined
f2
бÑла вÑзвана напÑÑмÑÑ, а не как меÑод или ÑвойÑÑво обÑекÑа (напÑимеÑ, window.f2()
). РеализаÑÐ¸Ñ ÑÑой оÑобенноÑÑи не поддеÑживалаÑÑ Ð² некоÑоÑÑÑ
бÑаÑзеÑаÑ
, когда они впеÑвÑе наÑали поддеÑживаÑÑ ÑÑÑогий Ñежим
. Ð ÑезÑлÑÑаÑе они некоÑÑекÑно возвÑаÑали обÑÐµÐºÑ window
.
ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¿Ñи вÑзове ÑÑнкÑии ÑÑÑановиÑÑ this
в опÑеделÑнное знаÑение, иÑполÑзÑйÑе call()
или apply()
, как в ÑледÑÑÑиÑ
пÑимеÑаÑ
.
// РкаÑеÑÑве пеÑвого аÑгÑменÑа меÑодов call или apply Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑедан обÑекÑ,
// на коÑоÑÑй бÑÐ´ÐµÑ ÑказÑваÑÑ this.
var obj = { a: "Custom" };
// ÐÑо ÑвойÑÑво пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑÐ½Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ
var a = "Global";
function whatsThis() {
return this.a; //знаÑение this завиÑÐ¸Ñ Ð¾Ñ ÐºÐ¾Ð½ÑекÑÑа вÑзова ÑÑнкÑии
}
whatsThis(); // 'Global'
whatsThis.call(obj); // 'Custom'
whatsThis.apply(obj); // 'Custom'
ÐÑÐ¸Ð¼ÐµÑ 2
function add(c, d) {
return this.a + this.b + c + d;
}
var o = { a: 1, b: 3 };
// ÐеÑвÑй паÑамеÑÑ - ÑÑо обÑÐµÐºÑ Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² каÑеÑÑве
// 'this', поÑледÑÑÑие паÑамеÑÑÑ Ð¿ÐµÑедаÑÑÑÑ ÐºÐ°Ðº
// аÑгÑменÑÑ ÑÑнкÑии call
add.call(o, 5, 7); // 16
// ÐеÑвÑй паÑамеÑÑ - ÑÑо обÑÐµÐºÑ Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² каÑеÑÑве
// 'this', вÑоÑой - маÑÑив, ÑÑи ÑÐ»ÐµÐ½Ñ Ð¸ÑполÑзÑÑÑÑÑ
// в каÑеÑÑве аÑгÑменÑов ÑÑнкÑии call
add.apply(o, [10, 20]); // 34
ÐбÑаÑиÑе внимание, ÑÑо в неÑÑÑогом Ñежиме, еÑли знаÑение, пеÑеданное в call
или apply как
this
, не ÑвлÑеÑÑÑ Ð¾Ð±ÑекÑом, бÑÐ´ÐµÑ Ñделана попÑÑка пÑеобÑазоваÑÑ ÐµÐ³Ð¾ в обÑÐµÐºÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð²Ð½ÑÑÑенней опеÑаÑии ToObject
. Таким обÑазом, еÑли пеÑеданное знаÑение ÑвлÑеÑÑÑ Ð¿ÑимиÑивом, Ñаким как 7
или 'foo'
, оно бÑÐ´ÐµÑ Ð¿ÑеобÑазовано в Object
Ñ Ð¸ÑполÑзованием ÑвÑзанного конÑÑÑÑкÑоÑа, Ñак ÑÑо пÑимиÑивное ÑиÑло 7
бÑÐ´ÐµÑ Ð¿ÑеобÑазовано в обÑÐµÐºÑ Ñак, как бÑдÑо Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ new Number(7)
, а ÑÑÑока 'foo'
- как бÑдÑо Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ new String('foo')
, напÑимеÑ
function bar() {
console.log(Object.prototype.toString.call(this));
}
bar.call(7); // [object Number]
bar.call("foo"); // [object String]
ÐеÑод bind()
ÐÑзов f.bind(someObject)
ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ ÑÑнкÑÐ¸Ñ Ñ Ñаким же Ñелом и окÑÑжением, ÑÑо и Ñ f
, но знаÑение this
ÑказÑÐ²Ð°ÐµÑ Ð½Ð° пеÑвÑй аÑгÑÐ¼ÐµÐ½Ñ bind
, незавиÑимо Ð¾Ñ Ñого, как вÑзÑваеÑÑÑ ÑÑнкÑиÑ.
function f() {
return this.a;
}
const g = f.bind({ a: "qwerty" });
console.log(g()); // qwerty
const h = g.bind({ a: "yoo" }); // bind ÑÑабоÑÐ°ÐµÑ ÑолÑко один Ñаз!
console.log(h()); // qwerty
const o = { a: 37, f, g, h };
console.log(o.a, o.f(), o.g(), o.h()); // 37 37 qwerty qwerty
this
в ÑÑÑелоÑнÑÑ
ÑÑнкÑиÑÑ
СÑÑелоÑнÑе ÑÑнкÑии ÑоздаÑÑ Ð·Ð°Ð¼ÑÐºÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ this
из окÑÑжаÑÑего конÑекÑÑа вÑполнениÑ. Ð ÑледÑÑÑем пÑимеÑе Ð¼Ñ ÑоздаÑм обÑÐµÐºÑ obj
Ñ Ð¼ÐµÑодом getThisGetter
, коÑоÑÑй возвÑаÑÐ°ÐµÑ ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение this
. ÐозвÑаÑÐ°ÐµÐ¼Ð°Ñ ÑÑнкÑÐ¸Ñ ÑвлÑеÑÑÑ ÑÑÑелоÑной, поÑÑÐ¾Ð¼Ñ ÐµÑ this
ÑвÑзано Ñ this
окÑÑжаÑÑей ÑÑнкÑии. ÐнаÑение this
внÑÑÑи getThisGetter
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑÑановлено пÑи вÑзове, коÑоÑÑй, в ÑÐ²Ð¾Ñ Ð¾ÑеÑедÑ, ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаемое знаÑение возвÑаÑаемой ÑÑнкÑии. ÐÑ Ð±Ñдем ÑÑиÑаÑÑ, ÑÑо getThisGetter
ÑвлÑеÑÑÑ Ð½ÐµÑÑÑогой ÑÑнкÑией, Ñо еÑÑÑ Ð¾Ð½Ð° наÑ
одиÑÑÑ Ð²Ð½ÑÑÑи неÑÑÑогого ÑкÑипÑа и не вложена в клаÑÑ Ð¸Ð»Ð¸ ÑÑÑогÑÑ ÑÑнкÑиÑ.
const obj = {
getThisGetter() {
const getter = () => this;
return getter;
},
};
ÐÑли вÑзваÑÑ getThisGetter
как меÑод обÑекÑа obj
, Ñо ÑÑо ÑвÑÐ¶ÐµÑ this
Ñ obj
внÑÑÑи его Ñела. ÐозвÑаÑÐ°ÐµÐ¼Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¿ÑиÑвоена пеÑеменной fn
. ТепеÑÑ Ð¿Ñи вÑзове fn
возвÑаÑаемое знаÑение this
по-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð·Ð°Ð´Ð°ÑÑÑÑ Ð²Ñзовом getThisGetter
, Ñо еÑÑÑ obj
. ÐÑли Ð±Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÐ¼Ð°Ñ ÑÑнкÑÐ¸Ñ Ð½Ðµ бÑла ÑÑÑелоÑной, Ñо пÑи ÑакиÑ
вÑзоваÑ
знаÑение this
бÑло Ð±Ñ globalThis
, поÑколÑÐºÑ getThisGetter
не ÑвлÑеÑÑÑ ÑÑÑогой.
const fn = obj.getThisGetter();
console.log(fn() === obj); // true
Ðо бÑдÑÑе оÑÑоÑÐ¾Ð¶Ð½Ñ Ð¿Ñи оÑвÑзÑвании меÑода obj
без его вÑзова, поÑÐ¾Ð¼Ñ ÑÑо getThisGetter
вÑÑ ÐµÑÑ Ð¼ÐµÑод, коÑоÑÑй Ð¸Ð¼ÐµÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑееÑÑ Ð·Ð½Ð°Ñение this
. ÐÑзов fn2()()
в ÑледÑÑÑем пÑимеÑе возвÑаÑÐ°ÐµÑ globalThis
, поÑÐ¾Ð¼Ñ ÑÑо он ÑледÑÐµÑ Ð·Ð° this
из fn2()
, коÑоÑÑй ÑвлÑеÑÑÑ globalThis
, поÑколÑÐºÑ Ð²ÑзÑваеÑÑÑ Ð±ÐµÐ· пÑивÑзки к какомÑ-либо обÑекÑÑ.
const fn2 = obj.getThisGetter;
console.log(fn2()() === globalThis); // true в неÑÑÑогом Ñежиме
Такое поведение оÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ пÑи опÑеделении обÑаÑнÑÑ
вÑзовов. ÐбÑÑно каждое ÑÑнкÑионалÑное вÑÑажение ÑоздаÑÑ ÑÐ²Ð¾Ñ ÑобÑÑвеннÑÑ Ð¿ÑивÑÐ·ÐºÑ this
, коÑоÑÐ°Ñ Ð¿ÐµÑекÑÑÐ²Ð°ÐµÑ Ð·Ð½Ð°Ñение this
окÑÑжаÑÑей облаÑÑи видимоÑÑи. ÐÑли вам не важно знаÑение this
, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе опÑеделÑÑÑ ÑÑнкÑии как ÑÑÑелоÑнÑе и ÑоздаваÑÑ Ð¿ÑивÑзки this
ÑолÑко Ñам, где ÑÑо необÑ
одимо (напÑимеÑ, в меÑодаÑ
клаÑÑа). СмоÑÑиÑе пÑÐ¸Ð¼ÐµÑ Ñ setTimeout()
.
Ðогда ÑÑнкÑÐ¸Ñ Ð²ÑзÑваеÑÑÑ ÐºÐ°Ðº меÑод обÑекÑа, иÑполÑзÑемое в ÑÑой ÑÑнкÑии клÑÑевое Ñлово this
пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð·Ð½Ð°Ñение обÑекÑа, по оÑноÑÐµÐ½Ð¸Ñ Ðº коÑоÑÐ¾Ð¼Ñ Ð²Ñзван меÑод.
Ð ÑледÑÑÑем пÑимеÑе, когда вÑзвано ÑвойÑÑво o.f()
, внÑÑÑи ÑÑнкÑии this
пÑивÑзано к обÑекÑÑ o.
var o = {
prop: 37,
f: function () {
return this.prop;
},
};
console.log(o.f()); // logs 37
ÐеобÑ
одимо оÑмеÑиÑÑ, ÑÑо на поведение this
ÑовÑем не влиÑÐµÑ Ñо, как или где бÑла опÑеделена ÑÑнкÑиÑ. РпÑедÑдÑÑем пÑимеÑе Ð¼Ñ Ð¾Ð¿Ñеделили ÑÑнкÑÐ¸Ñ Ð²Ð½ÑÑÑи ÑвойÑÑва f
во вÑÐµÐ¼Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑа o
. Ðднако, Ð¼Ñ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ Ñакже пÑоÑÑо опÑеделиÑÑ ÑнаÑала ÑÑнкÑиÑ, а заÑем закÑепиÑÑ ÐµÑ Ð·Ð° ÑвойÑÑвом o.f
. Ð ÑÑом ÑлÑÑае поведение this
не измениÑÑÑ:
var o = { prop: 37 };
function independent() {
return this.prop;
}
o.f = independent;
console.log(o.f()); // logs 37
ÐÑи пÑимеÑÑ Ð¿Ð¾ÐºÐ°Ð·ÑваÑÑ, ÑÑо Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение ÑолÑко Ñо, ÑÑо ÑÑнкÑÐ¸Ñ Ð±Ñла вÑзвана из ÑвойÑÑва f
обÑекÑа o
.
ÐналогиÑно, пÑивÑзÑвание this
обÑÑлавливаеÑÑÑ Ð½Ð°Ð»Ð¸Ñием ближайÑей ÑÑÑлки на обÑÐµÐºÑ Ð¸Ð»Ð¸ ÑвойÑÑво. Ð ÑледÑÑÑем пÑимеÑе, когда Ð¼Ñ Ð²ÑзÑваем ÑÑнкÑиÑ, Ð¼Ñ Ð¾Ð±ÑаÑаемÑÑ Ðº ней как к меÑÐ¾Ð´Ñ g
обÑекÑа o.b
. Ðа ÑÑÐ¾Ñ Ñаз во вÑÐµÐ¼Ñ Ð²ÑполнениÑ, this
, ÑÑо наÑ
одиÑÑÑ Ð²Ð½ÑÑÑи ÑÑнкÑии, бÑÐ´ÐµÑ ÑÑÑлаÑÑÑÑ Ð½Ð° o.b
. Ð¢Ð¾Ñ ÑакÑ, ÑÑо обÑÐµÐºÑ ÑвлÑеÑÑÑ Ñленом обÑекÑа o
, не Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°ÑениÑ; важна ÑолÑко ближайÑÐ°Ñ ÑÑÑлка.
o.b = { g: independent, prop: 42 };
console.log(o.b.g()); // logs 42
this
в ÑепоÑке object's prototype
ÐÑо же пÑедÑÑавление ÑпÑаведливо и Ð´Ð»Ñ Ð¼ÐµÑодов, опÑеделÑннÑÑ
где-либо в ÑепоÑке object's prototype. ÐÑли меÑод наÑ
одиÑÑÑ Ð² ÑепоÑке пÑоÑоÑипов, Ñо this
ÑÑÑлаеÑÑÑ Ð½Ð° обÑекÑ, на коÑоÑом бÑл вÑзван меÑод, Ñ.е. Ñак, Ñловно меÑод ÑвлÑеÑÑÑ Ð¼ÐµÑодом Ñамого обÑекÑа, а не пÑоÑоÑипа.
var o = {
f: function () {
return this.a + this.b;
},
};
var p = Object.create(o);
p.a = 1;
p.b = 4;
console.log(p.f()); // 5
Ð ÑÑом пÑимеÑе обÑекÑ, коÑоÑÑй пÑиÑвоен пеÑеменной p
, не Ð¸Ð¼ÐµÐµÑ ÑобÑÑвенного ÑвойÑÑва f
, а наÑледÑÐµÑ ÑÑо ÑвойÑÑво Ð¾Ñ Ñвоего пÑоÑоÑипа. Ðднако, ÑовеÑÑенно неважно, ÑÑо поиÑк ÑвойÑÑва f в конÑе конÑов обнаÑÑÐ¶Ð¸Ñ ÐµÐ³Ð¾ на обÑекÑе o
. ÐоÑколÑÐºÑ Ð¿Ð¾Ð¸Ñк наÑалÑÑ Ñ p.f
, Ñо и ÑвойÑÑво this
внÑÑÑи ÑÑнкÑии f
бÑÐ´ÐµÑ ÑÑÑлаÑÑÑÑ Ð½Ð° обÑÐµÐºÑ p
. Таким обÑазом, еÑли f
вÑзÑваеÑÑÑ ÐºÐ°Ðº меÑод p
, Ñо и this
оÑноÑиÑÑÑ Ðº p
. ÐÑо Ð¿Ð¾Ð»ÐµÐ·Ð½Ð°Ñ Ð¾ÑобенноÑÑÑ Ð¿ÑоÑоÑипного наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ JS.
this
Ñ Ð³ÐµÑÑеÑами/ÑеÑÑеÑами
ÐÑе Ñе же ÑÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ ÑпÑаведливÑ, еÑли ÑÑнкÑÐ¸Ñ Ð²ÑзÑваеÑÑÑ Ð¸Ð· геÑÑеÑа или ÑеÑÑеÑа. ÐÐ»Ñ ÑÑнкÑии, коÑоÑÐ°Ñ Ð¸ÑполÑзÑеÑÑÑ ÐºÐ°Ðº геÑÑÐµÑ Ð¸Ð»Ð¸ ÑеÑÑÐµÑ this
пÑивÑзан к обÑекÑÑ, ÑвойÑÑво коÑоÑого необÑ
одимо извлеÑÑ ÑеÑез геÑÑеÑ/ÑеÑÑеÑ.
function modulus() {
return Math.sqrt(this.re * this.re + this.im * this.im);
}
var o = {
re: 1,
im: -1,
get phase() {
return Math.atan2(this.im, this.re);
},
};
Object.defineProperty(o, "modulus", {
get: modulus,
enumerable: true,
configurable: true,
});
console.log(o.phase, o.modulus); // logs -0.78 1.4142
РконÑÑÑÑкÑоÑе
Ðогда ÑÑнкÑÐ¸Ñ Ð¸ÑполÑзÑеÑÑÑ ÐºÐ°Ðº конÑÑÑÑкÑÐ¾Ñ (Ñ ÐºÐ»ÑÑевÑм Ñловом new
), this
ÑвÑзано Ñ ÑоздаваемÑм новÑм обÑекÑом.
ÐÑимеÑание: по ÑмолÑÐ°Ð½Ð¸Ñ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¾Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð¾Ð±ÑекÑ, на коÑоÑÑй ÑÑÑлаеÑÑÑ this
, но он Ð¼Ð¾Ð¶ÐµÑ Ð²ÐµÑнÑÑÑ Ð¸ дÑÑгой обÑÐµÐºÑ (еÑли возвÑаÑаемое знаÑение не ÑвлÑеÑÑÑ Ð¾Ð±ÑекÑом, Ñогда бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑÑн обÑÐµÐºÑ Ñ this
).
/*
* ÐонÑÑÑÑкÑÐ¾Ñ ÑабоÑÐ°ÐµÑ Ñаким обÑазом:
*
* function MyConstructor(){
* // ÑакÑиÑеÑкий код, ÑоÑÑавлÑÑÑий Ñело ÑÑнкÑии.
* // Ñоздание ÑвойÑÑв Ñ |this| по
* // желаниÑ, опÑеделÑÑ Ð¸Ñ
знаÑениÑ; напÑимеÑ,
* this.fum = "nom";
* // и Ñ.д.
*
* // ÐÑли ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð²ÑÑажение,
* // возвÑаÑаÑÑее обÑекÑ, ÑÑÐ¾Ñ Ð¾Ð±ÑÐµÐºÑ Ð±ÑдеÑ
* // ÑезÑлÑÑаÑом вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ |new|. РобÑаÑном ÑлÑÑае,
* // ÑезÑлÑÑÐ°Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ - обÑекÑ,
* // в даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿ÑивÑзаннÑй к |this|
* // (Ñ.е. наиболее ÑаÑÑо вÑÑÑеÑаÑÑийÑÑ ÑлÑÑай).
* }
*/
function C() {
this.a = 37;
}
var o = new C();
console.log(o.a); // logs 37
function C2() {
this.a = 37;
return { a: 38 };
}
o = new C2();
console.log(o.a); // logs 38
РпоÑледнем пÑимеÑе (C2
), из-за Ñого, ÑÑо конÑÑÑÑкÑÐ¾Ñ Ð²ÐµÑнÑл обÑекÑ, новÑй обÑекÑ, к коÑоÑÐ¾Ð¼Ñ Ð±Ñло пÑивÑзано this
, бÑл пÑоÑÑо оÑбÑоÑен. (ÐÑо ÑакÑиÑеÑки Ð´ÐµÐ»Ð°ÐµÑ Ð²ÑÑажение "this.a = 37;
" "мÑÑÑвÑм" кодом. Ðн не ÑвлÑеÑÑÑ Ð±ÑквалÑно неÑабоÑим, Ñак как он вÑполнÑеÑÑÑ, но он Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸Ð·ÑÑÑ Ð±ÐµÐ· какиÑ
-либо внеÑниÑ
ÑÑÑекÑов.)
call
и apply
Ðогда в Ñеле ÑÑнкÑии иÑполÑзÑеÑÑÑ ÐºÐ»ÑÑевое Ñлово this
, его знаÑение Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑивÑзано к конкÑеÑÐ½Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ Ð² вÑзове пÑи помоÑи меÑодов call
или apply
, коÑоÑÑе наÑледÑÑÑÑÑ Ð²Ñеми ÑÑнкÑиÑми Ð¾Ñ Function.prototype
.
function add(c, d) {
return this.a + this.b + c + d;
}
var o = { a: 1, b: 3 };
// ÐеÑвÑй паÑамеÑÑ - ÑÑо обÑекÑ, коÑоÑÑй ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ ÐºÐ°Ðº
// 'this', поÑледÑÑÑие паÑамеÑÑÑ Ð¿ÐµÑедаÑÑÑÑ
// как аÑгÑменÑÑ Ð¿Ñи вÑзове ÑÑнкÑии
add.call(o, 5, 7); // 1 + 3 + 5 + 7 = 16
// ÐеÑвÑй паÑамеÑÑ - обÑекÑ, коÑоÑÑй ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ ÐºÐ°Ðº
// 'this', вÑоÑой паÑамеÑÑ - маÑÑив,
// ÑлеменÑÑ ÐºÐ¾ÑоÑого иÑполÑзÑÑÑÑÑ ÐºÐ°Ðº аÑгÑменÑÑ Ð¿Ñи вÑзове ÑÑнкÑии
add.apply(o, [10, 20]); // 1 + 3 + 10 + 20 = 34
ÐеобÑ
одимо оÑмеÑиÑÑ, ÑÑо еÑли меÑодам call
и apply
пеÑедаÑÑÑÑ Ð·Ð½Ð°Ñение Ñ this
, коÑоÑое не ÑвлÑеÑÑÑ Ð¿Ñи ÑÑом обÑекÑом, бÑÐ´ÐµÑ Ð¿ÑедпÑинÑÑа попÑÑка конвеÑÑиÑоваÑÑ Ð·Ð½Ð°Ñение в обÑекÑ, иÑполÑзÑÑ Ð²Ð½ÑÑÑеннÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ ToObject
. ÐÑли пеÑеданное знаÑение ÑвлÑеÑÑÑ Ð¿ÑимиÑивнÑм Ñипом, напÑÐ¸Ð¼ÐµÑ 7
или 'foo'
, оно бÑÐ´ÐµÑ Ð¿ÑеобÑазовано в обÑÐµÐºÑ Ñ Ð¸ÑполÑзованием ÑодÑÑвенного конÑÑÑÑкÑоÑа, Ñак пÑимиÑив 7
пÑеобÑазовÑваеÑÑÑ Ð² обÑÐµÐºÑ ÑеÑез new Number(7),
а ÑÑÑока 'foo'
в обÑÐµÐºÑ ÑеÑез new String('foo'),
и Ñ.д.
function bar() {
console.log(Object.prototype.toString.call(this));
}
bar.call(7); // [object Number]
Ðак обÑабоÑÑик ÑобÑÑий DOM
Ðогда ÑÑнкÑÐ¸Ñ Ð¸ÑполÑзÑеÑÑÑ ÐºÐ°Ðº обÑабоÑÑик ÑобÑÑий, this
пÑиÑваиваеÑÑÑ ÑлеменÑÑ Ñ ÐºÐ¾ÑоÑого наÑинаеÑÑÑ ÑобÑÑие (некоÑоÑÑе бÑаÑзеÑÑ Ð½Ðµ ÑледÑÑÑ ÑÑÐ¾Ð¼Ñ ÑоглаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾Ð±ÑабоÑÑиков, добавленнÑÑ
динамиÑеÑки Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð²ÑеÑ
меÑодов, кÑоме addEventListener
).
// Ðогда вÑзÑваеÑÑÑ ÐºÐ°Ðº обÑабоÑÑик, ÑвÑзаннÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑÑановиÑÑÑ Ñиним
function bluify(e) {
// ÐÑегда true
console.log(this === e.currentTarget);
// true, когда currentTarget и target один обÑекÑ
console.log(this === e.target);
this.style.backgroundColor = "#A5D9F3";
}
// ÐолÑÑиÑÑ ÑпиÑок каждого ÑлеменÑа в докÑменÑе
var elements = document.getElementsByTagName("*");
// ÐобавиÑÑ bluify как обÑабоÑÑика кликов, ÑÑÐ¾Ð±Ñ Ð¿Ñи
// нажаÑии на ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¾Ð½ ÑÑановилÑÑ Ñиним
for (var i = 0; i < elements.length; i++) {
elements[i].addEventListener("click", bluify, false);
}
Ринлайновом обÑабоÑÑике ÑобÑÑий
Ðогда код вÑзван из инлайнового обÑабоÑÑика, this
ÑказÑÐ²Ð°ÐµÑ Ð½Ð° DOM-ÑлеменÑ, в коÑоÑом ÑаÑположен код ÑобÑÑиÑ:
<button onclick="alert(this.tagName.toLowerCase());">ÐоказаÑÑ this</button>
Ðод вÑÑе вÑÐ²ÐµÐ´ÐµÑ 'button
'. СледÑÐµÑ Ð¾ÑмеÑиÑÑ, ÑÑо this
бÑÐ´ÐµÑ ÑказÑваÑÑ Ð½Ð° DOM-ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑолÑко во внеÑниÑ
(не вложеннÑÑ
) ÑÑнкÑиÑÑ
:
<button onclick="alert((function() {return this;} ()));">
ÐоказаÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñй this
</button>
Ð ÑÑом ÑлÑÑае this
вложенной ÑÑнкÑии не бÑÐ´ÐµÑ ÑÑÑановлен, Ñак ÑÑо бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑÑн global/window обÑекÑ.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4