2015-03-17 5 views
0

Пожалуйста, обратите внимание на следующие JS фрагмент кода:Объем переменных в JS

var MyClass = function() { 
    var logging = true; 

    this.myFunction = function(logging) { 

    } 
} 

myObj = new MyClass(); 
myObj.myFunction(false); 

Есть ли способ, чтобы получить доступ к обоим лесозаготовительных переменные в MYFUNCTION?

Единственным решением, которое я мог придумать (this.logging) не похожа на работу: https://jsfiddle.net/x7m3w3gp/

ответ

1

Из кода в методе myFunction это не представляется возможным получить доступ к локальной переменной из сферы за ее пределами, так как параметр затенения переменной.

Использование this.logging не имеет доступа к переменной, оно будет обращаться к свойству объекта с тем же именем.

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

Пример переменных, свойства и мостов использования:

var MyClass = function() { 
    // local variable 
    var logging = true; 
    // property 
    this.logging = 1; 

    // bridge local variable 
    function getLogging() { return logging; } 

    this.myFunction = function(logging) { 
     console.log(logging); // parameter 
     console.log(this.logging); // property 
     console.log(getLogging()); // local variable 
    } 
} 

myObj = new MyClass(); 
myObj.myFunction(false); 
+0

Спасибо! Метод getter наилучшим образом подходит для меня, поскольку локальная переменная _logging_ не должна быть доступна через, например, 'myObj.logging'. – bernland

0

В коде, формальный параметр этой анонимной функции вы создаете имеет такое же имя, как и локальные переменные («протоколирование» в обоих случаях). Внутри этой анонимной функции (той, которая заканчивается как свойство myFunction), символ «logging» будет ссылаться на параметр. Невозможно получить доступ к локальной переменной, которая также называется «протоколированием».

Решение этого вопроса - дать параметру другое имя.

Обратите внимание, что this.logging будет ссылаться на свойство с именем «logging», если оно есть. В коде, который вы опубликовали, такого свойства нет.

0

Попробуйте определить регистрацию как свойство MyClass. Это должно работать:

var MyClass = function() { 
    this.logging = true; 
} 


MyClass.prototype.myFunction = function(logging) { 
    /*References the logging-Property of the MyClass-Object:*/ 
    var log1 = this.logging; 

    /*References the parameter:*/ 
    var log2 = logging; 
} 

myObj = new MyClass(); 
myObj.myFunction(false); 
+0

'prototype' не имеет ничего общего с этим. – SLaks

+0

Хотя что-то подобное может решить проблему OP, обратите внимание на то, что публикация переменной «logging» как свойства объекта существенно отличается от сохранения закрытой переменной в закрытии. – Pointy

+0

@SLaks: Вы правы, определение регистрации в качестве свойства имеет ... –

0

Это должно работать;

var MyClass = function() { 
    this.logging = true; 
    var logging = 0; 

    this.myFunction = function(logging) { 
     var console = document.getElementById('console'); 
     console.innerHTML = 'logging: ' + logging + '<br />'; 
     console.innerHTML += 'this.logging: ' + this.logging + '<br/>'; 
     console.innerHTML += 'var loggin:' + logging + ' !!! <br/>--> var logging scope never access'; 
    } 
} 

myObj = new MyClass(); 
myObj.myFunction(false); 

https://jsfiddle.net/x7m3w3gp/2/

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