我正在努力学习一些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:
答案 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();