我对javascript非常陌生,所以对可能无关紧要的问题道歉?
var foo = function () {
a = "10";
this.b = "20";
};
foo.c = "30";
console.log(foo.a); // undefined
console.log(foo.c); // prints 30.
var foo1 = new foo();
console.log(foo1.b) // prints 20
如何访问var“a”?它甚至可能吗?
答案 0 :(得分:4)
实际上,只要你没有为var
加上变量声明的前缀,它就是全局的:
var foo = function () {
a = "10";
this.b = "20";
};
foo();
console.log(a); // is 10
与:相比:
var foo = function () {
var a = "10"; // private scope
this.b = "20";
};
foo();
console.log(a); // is undefined
答案 1 :(得分:2)
使用全局变量:
var a = 10;
var foo = function() {
a = 15;
this.b = 20;
};
console.log(a); // equals 10
foo();
console.log(a); // equals 15
如果你想在函数中实际访问变量a
,就像你的例子一样:
var foo = function() {
a = 10; // private member
};
无法访问该私人会员。
当您以这种方式声明变量时,您已经创建了一个全局变量。您可以使用console.log(a);
访问它,它将返回10
。但是,如果您在函数中使用var a = 10;
,则无法访问此成员。
答案 2 :(得分:0)
您可以做的是在构造函数中返回一个定义公共成员的对象:
function Foo() {
var a = '10';
function getA() {
return a;
}
return {
'a': a,
'b': 20,
'getA': getA
};
}
var foo = new Foo();
console.log(foo.a) // 10
console.log(foo.b); // 20
console.log(foo.getA()); // 10
答案 3 :(得分:0)
代码
console.log(foo.a);
console.log(foo.c);
表示您认为a
将被设置为等效于foo.a = "10"
,即设置“class”foo
的静态字段。在JavaScript中不是这种情况。
a = "10";
这会将全局变量a
设置为值"10"
,并在必要时创建全局变量槽。应避免使用此类全局分配,并使用JSLint等工具捕获。
this.b = "20";
这会将作为函数的this
参数传递的对象的字段设置为"20"
,并在必要时创建字段槽。请注意,如果您直接致电foo
,例如foo()
,没有new
,全局范围将作为this
传递,this.b
也将创建一个全局变量。严格模式可以捕获此类错误。如果以严格模式执行,undefined
将作为this
参数传入,这将引发异常。
var foo1 = new foo();
这将创建一个新的空对象,其__proto__
属性设置为prototype
foo
属性的值,然后调用foo
将新对象作为this
参数。 __proto__
的所有字段都显示为对象字段的默认值。这导致了向构造函数的prototype
对象添加方法和在构造函数中初始化字段的约定。可以通过使用祖先原型对象作为其__proto__
值构造对象并将其分配给构造函数的函数prototype
属性来模拟继承。构造函数也会调用祖先构造函数(没有new
),将其this
作为构造函数的this
参数传递(使用apply
或call
) 。这有点尴尬所以ECMAScript 6将其标准化为class
构造,大致转换为我所描述的内容。