2016-12-05 3 views
7

В этом code snippet, почему это this.identifier не работает, но _self.url работает?Что означает «let_self = this» в Javascript/Typcript?

getConfig() { 
    let _self = this; 
    return function() { 
     this.page.url = this.url || window.location.href; 
     this.page.identifier = _self.identifier; 
     this.page.category_id = this.categoryId; 
     this.language = this.lang; 
    }; 
} 

Так делает let _self = this на самом деле делаете?

+1

Возможный дубликат [Как работает ключевое слово this?] (http://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work) – toskv

+0

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let – naththedeveloper

+3

Возможный дубликат [Что лежит в основе этой идиомы JavaScript: var self = this?] (Http://stackoverflow.com/ вопросы/962033/что-лежит в основе-это-на JavaScript идиома-вар-я-это) – JJJ

ответ

2

Он принимает значение this (которое определяется how the function is called) и сохраняет его в переменной (которая по-прежнему доступна в замыкании (что будет иметь другое значение this, когда его называют), что getConfig возвращается) ,

10

Во-первых, вы получаете голос, поскольку это не глупый вопрос. Некоторые люди на Stackoverflow являются wayyyy на право.

Функции имеют что-то, называемое контекстом. Контекст - это объект, на который вызывается функция.

let person = { 
    name:"bill", 
    speak:function(){ 
     console.log("hi i am "+this.name) 
    } 
} 

, если вы должны были сделать person.speak()

он будет называться на объект, который был определен. Переменная person - это контекст

поэтому если вы это скажете. это то же самое, что сказать person.name

Теперь вы можете прикрепить функцию к чему-то еще.

var newperson = {name:'jill'} 
newperson.speak = person.speak; 

это будет печатать привет, я звоню, когда это называется.

понять это первым.

Теперь на втором шаге.

GetConfig возвращает функцию, однако эта функция не прикреплена ни к одному объекту.

Проверьте это.

let person = { 
    name:"bill", 
    getSpeakFunction:function(){ 
     return function(){ 
     console.log('hi my name is '+this.name) 
     } 

    } 
} 


let func = person.getSpeakFunction() 

Теперь функция func является само по себе.

Теперь, когда его называют «кто», о котором вы, черт возьми, говорите. Вот что думает функция.

Таким образом, мы можем помочь функции, сказав.

let person = { 
    name:"bill", 
    getSpeakFunction:function(){ 
     let context = this; //listen hear function this is what i am talking about 
     return function(){ 
     console.log('hi my name is '+context.name) 
     } 

    } 
} 


let func = person.getSpeakFunction() 

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

так используя слово _self, context, $ this или что-нибудь еще, когда вы присваиваете ему значение этого. «заблокирован на месте», как и любая другая регулярная переменная.

let a = 2; 
//this will never change 

let _self = this //_self will never change as it's your variable 

Теперь, когда вы вызываете свою функцию, и она ищет _self.он точно знает, о чем вы говорите.

пс. я также ищу голоса;)

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