JS中变量的作用域
Scope of variables in JS
请查看以下 JS 代码段:
var MyClass = function() {
var logging = true;
this.myFunction = function(logging) {
}
}
myObj = new MyClass();
myObj.myFunction(false);
有没有办法访问 myFunction 中的两个 logging 变量?
我想出的唯一解决方案 (this.logging) 似乎不起作用:
https://jsfiddle.net/x7m3w3gp/
在您的代码中,您创建的匿名函数的形式参数与局部变量同名(在这两种情况下都是 "logging")。在该匿名函数(以 "myFunction" 属性 结尾的函数)中,符号 "logging" 将引用参数。无法访问也称为 "logging".
的局部变量
解决这个问题的方法是给参数一个不同的名称。
请注意,this.logging
指的是名为 "logging" 的 属性,如果有的话。在您发布的代码中,没有这样的 属性.
尝试将日志记录定义为 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);
在 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);
这应该有效;
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);
请查看以下 JS 代码段:
var MyClass = function() {
var logging = true;
this.myFunction = function(logging) {
}
}
myObj = new MyClass();
myObj.myFunction(false);
有没有办法访问 myFunction 中的两个 logging 变量?
我想出的唯一解决方案 (this.logging) 似乎不起作用: https://jsfiddle.net/x7m3w3gp/
在您的代码中,您创建的匿名函数的形式参数与局部变量同名(在这两种情况下都是 "logging")。在该匿名函数(以 "myFunction" 属性 结尾的函数)中,符号 "logging" 将引用参数。无法访问也称为 "logging".
的局部变量解决这个问题的方法是给参数一个不同的名称。
请注意,this.logging
指的是名为 "logging" 的 属性,如果有的话。在您发布的代码中,没有这样的 属性.
尝试将日志记录定义为 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);
在 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);
这应该有效;
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);