JS是否可以访问函数变量?

时间:2014-08-17 18:20:46

标签: javascript function

我的理解是,使用JavaScript a" function",是一个函数,但也可以是构造函数,也可以是对象本身。如果我设计一个函数(如返回),但也像构造函数一样,我是否可以访问返回值和函数范围之外的属性?像这样

function Tree() {
    this.name = "Boris";
    var age = 18
    var cookies = "cookies"    // defined with var instead of this.cookies

    return age;
}

var r1 = Tree();       // r1 == 18
r1.name                // undefined
var r2 = new Tree();   // r2 == { name: "Boris" }, but no age or cookies

那么我可以使用同一个对象访问名称,年龄和Cookie吗?我越来越想到这一点,出于安全原因,我想做的事情可能是不可能的,但我仍然想知道。

使用obj.constructor(),您再次可以访问用于创建obj的函数,从而获得返回值。注意:前缀为new将返回另一个对象,而不是返回值。

 var r2 = new Tree();   // r2 == { name: "Boris" }
 r2.constructor()       // 18
 new r2.constructor()   // { name: "Boris" }, not what I want

我无法找到一种方法来访问用var定义的变量。帮助

3 个答案:

答案 0 :(得分:1)

不,你不能从功能中获得变量。原因 - function scopes,看一看。

但如果您仍想获取变量,我建议以这种方式编写代码:

function Tree() {
    this.name = "Boris";
    this.age = 18;
    return this;
}

因此,如果您想要访问变量,则需要使用this

OR

您可以在原型中定义属性。例如:

function Tree() {
    this.name = 'Boris';
    return this;
}

Tree.prototype = Object.create({
    age: 18
});

var tree = new Tree();
tree.name == 'Boris'; // true
tree.age == 18; // true

但如果此变量在函数范围内关闭,则无法访问使用var定义的变量。

答案 1 :(得分:0)

  

那么我可以使用同一个对象访问名称,年龄和Cookie吗?

,此"不可访问性"有助于在javascript中实现私有变量和封装。


允许访问所有内容的示例:

function Tree() {
    if (!this) return new Tree();
    this.name = "Boris";
    var age = 18
    var cookies = "cookies"    // defined with var instead of this.cookies
    this.getAge = function() { return age; };
    this.getCookies = function() { return cookies; };
}

答案 2 :(得分:0)

使用new关键字调用时,函数被视为构造函数。例如:

function Cat(name) {
  this.name = name;
  return "my name is " + this.name;
}

var a = new Cat("barry");
var b = Cat("larry");

这里,a被分配给使用Cat函数作为构造函数的结果,而b是将Cat作为普通函数调用的结果。 typeof b将为"string",因为结果只是函数的返回值。

typeof a将为"object",因为new关键字会更改表达式行为 - 它会生成一个新对象,并以这种方式调用构造函数(称为绑定this变量是对该对象的引用。正如您所指出的那样,该表达式的结果是this对象,不是返回值。

您似乎想要描述的是私有变量 - 即在对象函数中可访问的变量(例如a.addOneToAge()),而不是通过a.age或类似的直接引用。虽然通常可以在JavaScript中使用闭包,但这对于对象来说是不可能的(我知道)。