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

时间:2014-03-04 21:22:31

标签: 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”?它甚至可能吗?

4 个答案:

答案 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参数传递(使用applycall) 。这有点尴尬所以ECMAScript 6将其标准化为class构造,大致转换为我所描述的内容。