2016-07-24 4 views
0

Я очень смущаюсь о значении this в момент вызова функции, используя функции стрелки. Давайте возьмем мой пример:Значение этого метода внутри объекта?

var obj = { 
    property: 5, 
    func1: function() { 
    console.log(this.property); 
    }, 
    func2:() => { 
    console.log(this.property); 
    } 
} 

Когда я поставил этот код на консоли браузера, происходит интересная вещь, func1() будет выводить 5как ожидалось *, но когда я запускаю func2 я получил undefined. Что здесь происходит? Почему значение внутри func2 ссылается на глобальный объект (Window в этом случае).

Я думаю, что ожидаю, что выход, потому что это так, как это работает, вот почему Алан и slevetman объясняют here и here соответственно. Но согласно the Jason's explanation

Функции стрелки не имеют своего значения. Значение этого параметра внутри функции стрелки всегда унаследовано от охватывающей области.

Итак, почему значение этого внутри func2 не наследует значение его ограждающих сферы obj?

+0

Кажется, вы понимаете, как 'this' ведет себя по-разному в функциях стрелки, но вы не понимаете, как' this' ведет себя в целом. – Oriol

ответ

3

Итак, почему значение этого внутри func2 не наследует значение его ограждающих сферы obj?

obj здесь не является «охватывающей» областью. Область, в которой вы определяете obj, является «охватывающей» областью.

Рассмотрим следующий пример:

var obj = { 
    property: 5, 
    func1: function() { 
     let func2 =() => { 
     console.log(this.property); 
     } 
     func2(); 
    }, 
} 
obj.func1(); // logs 5 
obj.func1.call({ 
    property: 6 
}) // logs 6 

Когда внутренняя func2 вызвана, this ключевое слово относится к obj как this в функции обертки func1 относится к obj и func2наследует значение this. Функция внутренней стрелки не связывает ее собственное значение this.

+0

То, что вы пытаетесь сказать мне, заключается в том, что охватывающий объем функции «Окно»? – Vercryger

+1

@Vohuman Любопытно, почему использование 'Function.prototype.call()' не устанавливает 'this' в' obj' в 'obj.func2.call (obj)'? https://jsfiddle.net/pje0dtgn/ – guest271314

+0

@Vohuman http://stackoverflow.com/questions/38557902/function-prototype-call-does-not-set-this-at-arrow-function – guest271314

-1

this в func2 наследует значение объема самой функции, не более. Для того, чтобы заставить его работать, вы должны сделать что-то вроде этого:

var obj = { 
    property: 5, 
    func1: function() { 
     console.log(this.property); // shows 5 
    }, 
    func2:() => { 
     console.log(this.property); // shows undefined 
     this.property = 6; 
     console.log(this.property); // shows 6 
    } 
} 
Смежные вопросы