在方法中交换变量

时间:2014-05-21 12:24:36

标签: javascript oop

我正在努力学习一些OOP,所以请耐心等待。我需要在其他地方使用我在一个函数中定义的变量。这是我的示例代码(我希望记录INTERCEPT!!,但它返回undefined):

function Talk() {
    var greeting;
    var pleaseStop; // declare it

    this.A = function () {
        greeting = 'hello';
        console.log(greeting);

        var intercept = function () {
           pleaseStop = 'INTERCEPT!';
        }
    }

    this.B = function () {
        greeting = 'goodbye';
        console.log(pleaseStop); // this returns undefined!
        console.log(greeting);
    }
}

var activateTalk = new Talk();

activateTalk.A();

activateTalk.B();

整个代码记录以下内容:

hello
undefined
goodbye 

我也尝试了intercept.pleaseStop()但它仍然返回undefined。有人知道解决方案吗?

修改

我第二次删除了var,但它仍然返回undefined:

http://jsfiddle.net/d654H/2/

5 个答案:

答案 0 :(得分:2)

var pleaseStop = 'INTERCEPT!';

你在这里声明一个新的函数局部变量;将var放到分配给范围内的现有变量。

然后,您需要实际调用 intercept;目前你只定义它。

你可以选择何时调用该功能;在this live example中,为了说明的目的,我只是在定义之后立即这样做。

答案 1 :(得分:1)

删除var的作业前面的pleaseStop

这会为构造函数中声明的pleaseStop指定一个新值,该值也可以从B内部看到:

var intercept = function () {
     pleaseStop = 'INTERCEPT!';
}

这声明了一个新的局部变量pleaseStop,与其他pleaseStop完全无关,在intercept之外不可见:

var intercept = function () {
     var pleaseStop = 'INTERCEPT!';
}

如果你使用后者而不是前者,你最终会改变另一个变量的值而不是你想要的变量。

答案 2 :(得分:1)

您的问题是您从未设置pleaseStop。您已将intercept声明为函数,但您从未调用它。因此,pleaseStop未定义。

答案 3 :(得分:0)

没有var关键字。

var pleaseStop  = "A";
function foo(){
    pleaseStop = "B"; // overwriting to "B"
}
foo();
alert(pleaseStop); // shows "B"

使用var关键字。

var pleaseStop  = "A";
function foo(){
    var pleaseStop  = "B" 
    // This defines a new variable 'pleaseStop'
    //  in the scope of function foo(){}.
}
foo();
alert(pleaseStop); // shows "A"

可变范围
JavaScript具有功能级范围。在大多数具有块级变量范围的语言中,变量可以在用大括号({和})包围的块中访问。但是JavaSciprt不会在块的末尾终止作用域,而是在函数结束时终止它们。

我确信有很多关于它的文章和文件。我用Google搜索并发现了一篇引人入胜的介绍性文章。 http://javascriptissexy.com/javascript-variable-scope-and-hoisting-explained/

希望这有帮助。

答案 4 :(得分:0)

首先你没有在任何地方调用intercept(),你也做了一些事情

var pleaseStop = 'INTERCEPT!';

将创建新变量而不是初始化全局变量

你可以做这样的事情

function Talk() {
    var greeting;
    var pleaseStop; // declare it
    this.A = function () {
        greeting = 'hello';
        console.log(greeting);

        var intercept = function () {
             pleaseStop = 'INTERCEPT!';//changed
        }
      intercept(); //..Added
    }

    this.B = function () {
        greeting = 'goodbye';
        console.log(pleaseStop); // this returns undefined!
        console.log(greeting);
    }
}

var activateTalk = new Talk();

activateTalk.A();

activateTalk.B();