如何在javascript中访问函数内部的变量?

如何在javascript中访问函数内部的变量?,javascript,Javascript,我对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”?有可能吗 使

我对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”?有可能吗

使用全局变量:

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在函数内部,您将无法访问此成员。

使用全局变量:

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
在函数内部,您将无法访问此成员。

实际上,只要您不在变量声明前面加上
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

实际上,只要不在变量声明前面加上
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

您可以在构造函数中返回定义公共成员的对象:

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

您可以在构造函数中返回定义公共成员的对象:

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
代码

console.log(foo.a);
console.log(foo.c);
这意味着您相信
a
将被设置为与
foo.a=“10”
等效的值,即设置“class”
foo
的静态字段。JavaScript中并非如此

 a = "10";
这将全局变量
a
设置为值
“10”
,必要时创建全局变量槽。应该避免这种类型的全局赋值,并由JSLint之类的工具捕获

 this.b = "20"; 
这会将作为函数的
参数传递的对象字段设置为
“20”
,必要时创建字段槽。请注意,如果直接调用
foo
,例如
foo()
,而不调用
new
,则全局范围将作为
this
传递,而
this.b
也将创建一个全局变量。这种类型的错误可以通过严格模式捕获。如果在严格模式下执行,
undefined
作为
this
参数传入,这将引发异常

var foo1 = new foo();
这将创建一个新的空对象,其
\uuuu proto\uuuu
属性设置为
foo
prototype
属性的值,然后调用
foo
将新对象作为
参数传递。
\uuuu proto\uuuu
的所有字段都显示为对象字段的默认值。这导致了向构造函数的
prototype
对象添加方法并初始化构造函数中的字段的惯例。通过构造一个对象,将祖先原型对象作为其
\uuuu proto\uuu
值,并将其分配给构造函数的functions
prototype
属性,可以模拟继承。构造函数还将调用祖先构造函数(不带
new
),将其
this
作为构造函数的
this
参数传递(使用
apply
call
)。这一切都有点尴尬,因此ECMAScript 6将其标准化为一个
构造,大致转换为我描述的内容。

代码

console.log(foo.a);
console.log(foo.c);
这意味着您相信
a
将被设置为与
foo.a=“10”
等效的值,即设置“class”
foo
的静态字段。JavaScript中并非如此

 a = "10";
这将全局变量
a
设置为值
“10”
,必要时创建全局变量槽。应该避免这种类型的全局赋值,并由JSLint之类的工具捕获

 this.b = "20"; 
这会将作为函数的
参数传递的对象字段设置为
“20”
,必要时创建字段槽。请注意,如果直接调用
foo
,例如
foo()
,而不调用
new
,则全局范围将作为
this
传递,而
this.b
也将创建一个全局变量。这种类型的错误可以通过严格模式捕获。如果在严格模式下执行,
undefined
作为
this
参数传入,这将引发异常

var foo1 = new foo();

这将创建一个新的空对象,其
\uuuu proto\uuuu
属性设置为
foo
prototype
属性的值,然后调用
foo
将新对象作为
参数传递。
\uuuu proto\uuuu
的所有字段都显示为对象字段的默认值。这导致了向构造函数的
prototype
对象添加方法并初始化构造函数中的字段的惯例。通过构造一个对象,将祖先原型对象作为其
\uuuu proto\uuu
值,并将其分配给构造函数的functions
prototype
属性,可以模拟继承。构造函数还将调用祖先构造函数(不带
new
),将其
this
作为构造函数的
this
参数传递(使用
apply
call
)。这一切都有点尴尬,所以ECMAScript 6将其标准化为一个
构造,它大致转换为我所描述的内容。

您可以始终使用全局变量。@JCOC611如何访问变量“a”?有可能吗?没有。这是私有范围变量的一种形式。错误。a在t中