2017-02-21 8 views
0

Функция, такая как ниже, может иметь локальную функцию, определяющую this.inc. Изменение значения inc на любой другой, например, i, изменяет результат - так ясно, что этот .inc не является определяемой пользователем переменной, а что-то еще внутреннее по отношению к this. Есть ли какие-либо объяснения относительно того, что такое inc, и почему он функционирует так?Что это такое?

function incr() { 
    var i = 0; 

    this.inc = function() { 
    i++; 
    } 
} 

Это изменение в результате может наблюдаться в ответ на мой предыдущий вопрос, found here, например, в этой конструкции (благодаря Paul S для расширения его от оператора троичной):

if (total !== 0) {this.inc = (this.inc || 0) + 1;} else {this.inc = -1 +1;} 

Итак, чтобы повторить, изменение this.inc на this.i (или любая другая переменная предположительно) не работает, но this.inc действительно работает. Итак, что же такое this.inc?


Из-за мою усталость и неправильно тестирование this.inc перед отправкой на этот вопрос, я понял использование переменной inc как внутренний по отношению к this, а не miscellaneously определяется программистом, поскольку изменение его изначально не работает меня. В связи с этим этот вопрос запрашивается для удаления.

+2

Вы вроде как правы, но ваша ошибка в том, что троянец не вводит никаких новых функций/областей/закрытий/контекст, поэтому поведение отличается. Вместо того, чтобы расширять RHS и оставлять его равным LHS, переместите LHS в каждую ветвь RHS, затем разверните его, и вы увидите, как он работает 'if (total! == 0) {this.inc = (this.inc || 0) + 1;} else {this.inc = -1 +1;} ' –

+0

@PaulS. Привет, это работает. – user1679669

+0

Хотя это не дубликат как таковой, объясняются ответы на это http://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-inside-a-callback/20279485#20279485 (и связанные вопросы) – user2864740

ответ

0

Похоже, что this.inc предполагается использовать как статическую переменную. Это означает, что в следующий раз, когда вы вызываете функцию «прогресс()», предыдущее значение «.inc» должно оставаться. Но я считаю это неуместным. Это лучше, чтобы определить «уаг вкл» вне функции прогресса(), такие, как:

var inc = 0; 

function progress(total) { 
    inc = (total !== 0? inc || 0: -1) + 1; 
    var percentage = Math.floor(inc/total * 100); 
    document.write('Processing ' + inc + '/' + total + ' ' + percentage + '%<br/>'); 
} 

Технически Javascript функция также является объектом. Таким образом, внутри вызова функции вы можете назначить свойство для функции, используя «this». Таким образом, объявив «this.inc» внутри него, теперь функция будет обладать свойством «inc»

+0

это нехорошее решение, вы можете улучшить оригинал, но не так –

+0

@KeithNicholas Есть ли причина, почему это так? – user1679669

+0

вы изолируете функцию от зависимой переменной –

0

В вашем примере inc является собственностью функции incr. Поскольку все в javascript является объектом, любая функция может иметь свои собственные свойства, как и любой другой объект. this - это специальная ссылка на javascript, которая ссылается на текущий объект, а оператор точки - это способ ссылки на свойство данного объекта, в данном случае - на себя.