2014-12-01 4 views
-1

Учитывая:Javascript изменяет переменную между вызывающей "методы"

function testfunc(i) { 

     this.foo = function() { 
      i = 2; 
      console.log("testfunc.foo before bar: " + i); 
      this.bar(); 
      console.log("testfunc.foo after bar: " + i); 
     }; 

     this.bar = function() { 
      i = 3; 
      console.log("testfunc.bar: " + i); 
     }; 
    } 

    var testvar = { 
     foo: function() { 
      i = 4; 
      console.log("testvar.foo before bar: " + i); 
      this.bar(); 
      console.log("testvar.foo after bar: " + i); 
     }, 

     bar: function() { 
      i = 5; 
      console.log("testvarbar: " + i); 
     } 
    }; 

    var a = new testfunc(); 
    var b = Object.create(testvar); 
    i = 1; 
    a.foo(); 
    console.log("main: " + i); 
    b.foo(); 
    console.log("main: " + i); 

Результат является:

"testfunc.foo до того бара: 2" scope.html: 37

«testfunc .bar: 3 "scope.html: 44

" testfunc.foo after bar: 3 "scope.html: 39

"Основной: 1" scope.html: 66

"testvar.foo до того бара: 4" scope.html: 51

"testvarbar: 5" scope.html: 58

«testvar .foo после бара: 5" scope.html: 53

"главная: 5" scope.html: 68

должен ли это быть так, что переменная я наследуется от одного метода/функция к другому в объекте javascript ? И означает ли это, что только несколько безопасный способ создания объекта в javascript использует «новый» для функции, или я полностью теряю точку?

ответ

0

Ваша переменная i является глобальной переменной (она не объявлена ​​локально, поэтому Javascript просто делает ее глобальной), поэтому везде, где вы ее меняете, это та же переменная, которую вы используете и изменяете.

Если вы хотите i быть локальными по отношению к методу ставить var перед ним каждое место вы объявите его так:

this.foo = function() { 
     var i = 2; 
     console.log("testfunc.foo before bar: " + i); 
     this.bar(); 
     console.log("testfunc.foo after bar: " + i); 
    }; 

Если вы хотите i быть собственностью вашего объекта, а затем ссылаться на него с this.i.

this.foo = function() { 
     this.i = 2; 
     console.log("testfunc.foo before bar: " + this.i); 
     this.bar(); 
     console.log("testfunc.foo after bar: " + this.i); 
    }; 

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

+0

Вау, я получил ключевое слово var назад, я думал, что это сделало вещи глобальными. Благодаря! – lash

+0

@lash - Объявление 'var i;' в глобальной области видимости создает глобальную переменную. Объявление 'var i;' в области функций создает локальную переменную. Назначение 'i' без предварительного объявления автоматически создает глобальную переменную (что у вас было). Эти неявные глобальные переменные считаются плохой практикой и даже сейчас являются ошибкой, если вы ставите JS в строгом режиме (цель строгого режима - избегать плохой практики и помочь JS-движку рассказать вам о них). – jfriend00

+0

Очень полезный ответ. Благодаря! – lash

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