2016-03-10 2 views
0

EDIT: Я думаю, что это не дубликат; это скрытый параметр, я хотел спросить о затенении относительно this и лексическом охвате, прочитав this SO Q/A re. затенение.Shadowing `this` - лексическое разрешение имени

Я думал, что смысл названия this может быть разрешен вид динамически (с точки зрения сферы охвата), с тем, чтобы объяснить, почему это не кажется мне быть решен лексически:

function foo() {return this;} 
var a = {f: foo}; 
var b = {f: foo}; 

a.f() !== b.f(); 
a.f() !== foo(); 
a.f() !== window; //not strict mode 

Но тогда я читал, что каждая функция получает сигнал this в качестве дополнительного параметра, молча. (Я понимаю, что стрелка функции различны.)

Очевидно helper() не работает, как мы могли бы надеяться:

ob = { 
    meth: function(){ 
    var helper = function() {return this;}; 
    return helper(); 
    } 
}; 
ob.meth(); //Window or undefined 

Насколько я понимаю, а не this быть решен, глядя на области видимости (результат ob), вместо этого интерпретатор вызывает helper() с this, установленным в undefined (строгий режим), молча передается в качестве аргумента.

Значительная часть this обходится, следовательно, лексическая область действия фактически находится в действии?

+2

'return helper.call (this)' – elclanrs

+0

Это не имеет никакого отношения к затенению. 'this' на самом деле просто скрытый параметр. – SLaks

+0

Нет никакой разницы между «разрешенным типом динамически *» и «* беззвучно передан в качестве дополнительного аргумента *»? – Bergi

ответ

-1

Так окрестный прицела это эффективно затеняются, следовательно, лексическая область действия фактически находится в действии?

Да, можно было бы просмотреть его с этой точки зрения. , связанный с областью helper, затеняет область, связанную с областью meth. (И если вы использовали функцию стрелки, это не так).

Однако вам все равно нужно помнить, что this - это не обычная переменная, а специальное ключевое слово. Он связан только с областями действия, он не доступен для записи, он имеет странную семантику coerce-to-object в неаккуратном режиме, и он всегда неявно связан - как вы говорите, скрытым параметром.

Если вы не пытаетесь понять, как this работает в функции стрелок (и их лексическое разрешение), аналогия с областями и затенением довольно бесполезна.

+0

Я попытаюсь вставить в первый абзац :) – KnewB

0

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

  1. объект, на котором функция была вызвана, например, valueOfThis.foo()
  2. первый аргумент apply или call, такие как foo.apply(valueOfThis, params) или foo.call(valueOfThis, ...).
  3. DOM-элемент, в случае обработчиков событий, таких, как <button onclick="alert(this.tagName.toLowerCase());"/>
  4. объект строится, когда функция используется в качестве конструктора, такие как Foo = function(){ ... }; new Foo()
  5. объект привязан к функции, если функции была создана при bind, таких, как bar = function(){ ... this ...}; foo = bar.bind(valueOfThis); foo()
  6. в геттера/сеттера, this относится к объекту, для которого свойство к которому осуществляется доступ, или набор, такие как valueOfThis.someProperty = 123
  7. window (обычно), если ни один из вышеуказанных случаев, например как foo()

@ Bergi предоставил great reference для всех этих комментариев ниже.

В случае связанных функций, функция вызывается на самом деле другая функция, чем был передан методу bind, так как метод bind создает новую функцию

+0

... или что-то еще. Ваш список не является исчерпывающим. – Bergi

+0

Что такое _this_: '[1,2,3,4,5] .filter (/./. Test,/[02468] $ /)' здесь? 'div.onclick()' тоже. 'setTimeout (that.method, 0);' слишком – dandavis

+0

@ Берги, не могли бы вы рассказать мне, что я забываю? – GreenGiant

Смежные вопросы