何时在函数中定义变量时使用`this`

时间:2014-01-09 06:15:32

标签: javascript scope closures

从我到目前为止所读到的内容,我们可以使用函数在javascript中创建一个具有“私有”/“公共”成员的对象。一些事情:

function foo(param1) {
    this.publicVar= param1;
    privateVar = "can't touch this";

    this.MC = function(){
        var ret = privateVar + ", " + this.publicVar; 
        return ret;
    };
}

使用var f = new foo("hammer time");调用时,我可以使用f.publicVar& f.MC(),但我无法触及privateVar

正如您在jsbin中所看到的,一切似乎都有效。

我没有得到的是在这种情况下使用this。 使用this.privateVar将是未定义的,使用不publicVar的{​​{1}}将是未定义的。

这是一个更详细的例子:jsfiddle 有2个选项来创建对象,并且尊重地调用它们:

this

问题1
function Option1(aX,aY) { var x,y; x = aX || 0; // `||` serves as guard, in case parameters y = aY || 0; // are not defined, initializes to 0; this.toString = function() { var retStr = "from Option 1: I am here: <br/>"+ "x: " + x + "<br/>" + // 1 "y: " + y + "<br/>" + // 1 "this.x: " + this.x + "<br/>" + // undefined "this.y: " + this.y + "<br/>" + // undefined "aX: " + aX + "<br/>" + // 1 "aY: " + aY ; // 1 return retStr; }; // `this` is returned implicitly } // first has only toString() as "public" member var first = new Option1(1,1); toString&amp; x位于Chrome调试器中y的{​​{1}}内,但closure无法访问。

scope variables

问题2
在此thisfunction Option2(aX,aY) { var x,y; this.x = aX || 0; this.y = aY || 0; this.toString = function() { var retStr = "from Option 2: I am here: <br/>"+ "x: " + x + "<br/>" + // undefined "y: " + y + "<br/>" + // undefined "this.x: " + this.x + "<br/>" + // 22 "this.y: " + this.y + "<br/>" + // 22 "aX: " + aX + "<br/>" + // 22 "aY: " + aY ; // 22 return retStr; }; } // second has x,y & toString() as "public" members var second = new Option2(22,22); &amp; toString 不要出现在Chrome调试器中x的{​​{1}}内,并且只能与y一起使用。

我希望closure能够访问scope variables,因为它会从外部函数继承它,但如果没有this则不可能。

任何澄清都将受到高度赞赏。欢呼声。

3 个答案:

答案 0 :(得分:0)

在选项1中(我将仅使用一个变量进行示例)

function Option1(aX) {
    var x; //defining x variable with a certain memory adress   
    x = aX || 0; //assigning to it a value

    //in this case "this.x" doesn't exist   

}

在选项2中:

function Option2(aX) {
    var x;//defining x variable with a certain memory adress

    this.x = aX || 0; //defining another variable with different memory address and
                      //assign to it the value of the passing parameter


   //in this case this.x != x

}

如果我要互相学习,请纠正我,如果我错了

答案 1 :(得分:0)

我想我明白现在发生了什么,感谢 c.P.u1 &amp;的 daguru 即可。
siledh :我想我很快就会开始阅读那本书。

这是更新的 - - &gt; jsbin link&lt; - 这可能会对它有所了解。

最近来自C#,我习惯在函数中定义我的变量,所以在上面的Option2中,xy未定义的原因是因为我'我们将它们定义为私有变量。

如果我不这样做,如果我试图在没有this的情况下使用它们,则会抛出异常,因为变量不存在(导致x is not defined)。

xy作为全局变量,将有点隐藏问题,因为它只会说x is undefined或回归到它的全局值,除非您理解,否则具有特定价值,可能只会造成更多混乱。

回顾:调用变量和结果:

  1. 对于函数中的“私有”变量(使用var privateVar = something;定义)

    • 来自方法内部
      • 使用privateVar进行通话 - &gt;为您提供局部变量,或者如果未定义则抛出错误(本地NOR全局)
      • 使用this.privateVar进行通话 - &gt;返回undefine(因为它在对象上创建了一个?)
    • privateVar 可从方法外部访问
  2. 对于函数中的“公共”变量(使用this.publicVar = something;定义)

    • 来自方法内部
      • 使用this.publicVar进行通话 - &gt;为您提供局部变量as(if)defined
      • 使用publicVar进行通话 - &gt;抛出一个ReferenceError(除非你在函数中定义了一个带有该名称的私有var,或者你有一个带有该名称的全局变量,在这种情况下,你将获得该变量。)
        注意:这是非常愚蠢的,但正如我的问题所证明的那样。
    • publicVar可从方法外部访问(使用对象)
  3. 希望这可以帮助某人并为他们保留一些头发:)

答案 2 :(得分:0)

你绝对应该通过 Douglas Crockford here阅读Private Members in JavaScript,其中解释了JavaScript中的privatepublic变量,并会解释为什么你的函数Option1Option2表现得如此。