2016-02-04 4 views
1
var stack_1 = 
     { 
      sp: 10, 
      stk: new Array(10), 

      push: function (v) 
      { 
      sp = sp - 1; 
      stk[sp] = v; 
      } 
    } 

Вопрос:Функция в JavaScript Object

Эта программа не работает. Потому что нам нужно написать «this.sp» и т. Д. Я не понимаю, зачем нам писать «this.sp», если функция полностью принадлежит «stack_1».

+0

'this' зависит от того, как функция вызываемый, а не там, где он определен. – Tushar

+2

Вот как работает javascript - в отличие от C#, например, он не «предполагает», что вы хотите использовать этот контекст для всего, к чему вы обращаетесь. –

+0

Пока переменная находится в локальной области, нет необходимости использовать 'this.variable ', если, конечно, не существует одинаково названной переменной вне объекта, но доступной изнутри объекта. – Defiant

ответ

0

Потому что this относится к текущему объекту, то есть stack_1 в вашем примере. И sp, stk - свойства stack_1, но не функции push. Вот почему вам нужно использовать this.sp, чтобы обозначить, что вы используете sp объект stack_1.

Так работает JavaScript.

+0

Эй, Я думал, что, поскольку функция «push» принадлежит к «stack_1», «push» должен иметь доступ ко всему из «stack_1». – GandalfDGrey

0

Контекст чаще всего определяется тем, как вызывается функция. Когда функция вызывается как метод объекта, this устанавливается на объекте метод вызывается, например:

var obj = { 
foo: function(){ 
    alert(this === obj);  
} 
}; 

obj.foo(); // true 
0

sp и stk не являются переменными, они свойства объекта. И свойства должны быть доступны относительно конкретного объекта.

Вы можете изменить функцию для использования stack_1.sp и stack_1.stk, чтобы получить доступ к свойствам этого объекта.

Или вы можете использовать this.sp и this.stk. Когда вы используете this, вы должны вызвать функцию как stack_1.push(), потому что специальная переменная this устанавливается автоматически только при вызове функции относительно определенного объекта.

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

0

одна вещь, которую стоит отметить, что вы можете изменить контекст/this внутри функции настройки его явно с call или apply:

var stack_1 = { 
 
    sp: 10, 
 
    stk: new Array(10), 
 

 
    push:function (v) { 
 
    this.sp = this.sp - 1; 
 
    this.stk[this.sp] = v; 
 
    console.log(this) 
 
    } 
 
} 
 

 
var stack_2 ={ 
 
    sp: 22, 
 
    stk: new Array(20) 
 
} 
 

 
stack_1.push(42) 
 
console.log(stack_1.stk) 
 

 
stack_1.push.call(stack_2,55) 
 
console.log(stack_2.stk)