JavaScript : Вопрос 1 : 17

Что находится в this в следующем фрагменте кода:

function test() { 
  this; 
} 
test(); 

 

Уважаемые учащиеся ниже Вы сможете увидеть ответ, перед тем, как ответить, пожалуйста, постарайтесь написать для себя ответ на черновике, и только потом сравните наш ответ с Вашим: 

 

Верно ли наше решение?

Ответ:

В приведенном коде значением this будет window. Механизм определения this в данном случае описывается стандартом ECMA-262, русский перевод 3 редакции которого можно увидеть на javascript.ru: javascript.ru/ecma/part11#a-11.2.3

Упрощенно говоря, чему будет равно this в функции определяется в месте ее вызова. Выражение вызова функции состоит из двух частей

1 выражение, результатом которого должна быть функция; назовем это подвыражением;

2 список аргументов для передачи в функцию.

Нотация — подвыражение(аргументы)

Вид этого подвыражения и определяет, чем будет this внутри функции. Если в этом подвыражении происходит обращение к полю объекта, то этот объект становится this (грубо говоря, мы вызываем поле объекта как функцию). Пример:

var object = {
    val: 'hi!',
    method: function(){ return this.val; }
};
object.method(); //вернет строку "hi!" 

//или аналогично
({
    val: 'hi!',
    method: function(){ return this.val; }
}).method() //вернет строку "hi!" 

В данном примере (в обоих случаях) функция была вызвана как член объекта, поэтому в качестве this в функцию method был передан именно этот объект. Как следствие, функция вернула заданное нами значения поля val.

Когда же функция вызывается не как член объекта, в функцию в качестве this передается значение undefined. А перед началом выполнения функции значения null и undefinedзаменяются на глобальный объект (window в браузерах). Пример:

function func() {
    return this.prop;
} 

window.prop = "Я - дитя window";
var obj = {prop: "Я - дитя obj"};
obj.func = func; 

func(); //вернет строку "Я - дитя window"
obj.func(); //вернет строку "Я - дитя obj" 

Кроме вызова функции как члена объекта, задать для функции значение this можно с использованием методов apply и call, которыми обладают (а точнее — наследуют от своего прототипа) все функции. Для этого нужно передать одной из этих функций первым аргументом объект, который должен стать this. Немного измененный предыдущий пример:

function func() {
    return this.prop;
} 

window.prop = "Я - дитя window";
var obj = {prop: "Я - дитя obj"};
obj.func = func;
var undefined; 

func(); //вернет строку "Я - дитя window"
func.call(null); //вернет строку "Я - дитя window"
func.call(); //вернет строку "Я - дитя window"
func.call(undefined); //вернет строку "Я - дитя window" 

func.apply(obj); //вернет строку "Я - дитя obj"
func.call(obj); //вернет строку "Я - дитя obj" 

Разницу между apply и call можно выяснить в уже упомянутом переводе стандарта на javascript.ru: http://javascript.ru/ecma/part15#a-15.3.4.3 Если кратко, то call передает функции в качестве ее аргументов свои, начиная со второго. Функция же apply передает в качестве аргументов функции элементы своего второго аргумента, который должен быть массивом (или объектом аргументов — см. javascript.ru: javascript.ru/ecma/part10#a-10.1.8 ).

Также следует отметить, что при использовании режима выполнения кода strict (он был введен в ECMAScript версии 5), передача функции undefined или null в качестве this больше не приводит к тому, что значением this автоматически становится глобальный объект (в браузерах — это window). В этом режиме this остается при своем прежнем значении — undefined (если передано значение undefined или не передано ничего) или null (если передано значение null). Пример:

function func() {
    'use strict';
    return this;
} 

window.func(); //вернет window
func(); //вернет значение undefined
func.call();  //вернет значение undefined
func.call(null); //вернет значение null 

var undefined;
func.call(undefined); //вернет undefined 

Подробнее о режимах можно прочитать на javascript.ru: es5.javascript.ru/x10.html#x10.1.1

О влиянии режима на определение значения this: es5.javascript.ru/x10.html#x10.4.3
1 балл


© Copyright © 2017 - 2019 Все права защищены. Бесплатное онлайн образование.
  • https://disdik.munabarat.go.id/nusantara/slot/
  • https://dispendik.sidoarjokab.go.id/nuansa/gacor/
  • https://dkpd.grobogan.go.id/jakarta/gacor/
  • https://sbobet88.blog.unsia.ac.id
  • https://pafinusantara.blog.unsia.ac.id/bet88
  • https://idn-poker.blog.unsia.ac.id
  • https://slot777-gacor.blog.unsia.ac.id
  • https://agen-188bet.blog.unsia.ac.id
  • https://situs-slot.blog.unsia.ac.id
  • https://bet88-slot.blog.unsia.ac.id
  • https://2021.kinerja.ekon.go.id/up/slot777
  • https://2021.kinerja.ekon.go.id/halal/bet88
  • https://program-gacor.blog.unsia.ac.id
  • surapati.ac.id
  • untagsby.ac.id
  • kingandiboston.com
  • janeashton.com
  • redbrickcafechester.com
  • villanosdeljazz.com
  • slot