我正在学习局部和全局变量。在此程序中,我的函数执行2件事。如果在函数中输入一个大于0的数字,则它将sets
Y变量。如果传递0,则displays
是Y变量。
function sety(x) {
if (x>0) y=x; else alert(y);
}
<button onclick="sety(222)">SET Y to 222</button>
<button onclick="sety(333)">SET Y to 333</button>
<button onclick="sety(0)">display the Y variable</button>
在此示例中,Y是全局变量。如果我想创建一个不包含全局变量的程序怎么办?如果我将var y
放在函数中,则将其设置为本地,对吗?但这不起作用。
我还有第二个问题。如果在设置变量之前单击“显示”按钮,则会出现错误。我尝试添加if(x=="undefined")
,但这仍然给我一个错误。在那种情况下我该如何防止错误。
答案 0 :(得分:3)
创建一个闭合。
(function() {
var y; // y is now local to this closure
window.sety = function(x) {
// however you still want sety() to be a global function,
// so you have to do this explicitly
if( x > 0) y = x;
else alert(y);
};
})();
我将注意到让函数做两件事通常是一个坏主意-尤其是带有“ set y”之类的名称。考虑将其分为两个功能sety(x)
和gety()
,后者返回该值,而不只是警告它。
答案 1 :(得分:0)
您可以向该函数添加属性并更新它。
function sety(x) {
if (x > 0) {
sety.y = x;
} else {
alert(sety.y);
}
}
<button onclick="sety(222)">SET Y to 222</button>
<button onclick="sety(333)">SET Y to 333</button>
<button onclick="sety(0)">display the Y variable</button>
答案 2 :(得分:0)
如果您尝试不设置显示变量而显示y的原因是未定义,那是因为行y = x
的行为类似于定义变量y的var y = x
。如果在尝试显示该行之前未执行该行(如果您先尝试显示该行则不会执行),那么var y
永远不会发生,这会给您带来错误。要解决此问题,必须在else之前定义y。
下面的代码段将是一个“局部变量”。本质上,每次执行函数时,它仅重新定义y。
function sety(x) {
var y;
if (x > 0) y = x;
else alert(y);
}
<button onclick="sety(222)">SET Y to 222</button>
<button onclick="sety(333)">SET Y to 333</button>
<button onclick="sety(0)">display the Y variable</button>
下面的代码段仅在尚未定义y的情况下定义。
function sety(x) {
if (x > 0) y = x;
else {
if (typeof y == 'undefined') {
var y;
}
alert(y);
}
}
<button onclick="sety(222)">SET Y to 222</button>
<button onclick="sety(333)">SET Y to 333</button>
<button onclick="sety(0)">display the Y variable</button>
现在,我不建议使用您使用的代码。下面的代码段是您应使用的代码。
function sety(x) {
y = x;
}
function gety() {
if (typeof y == 'undefined') {
y = 'undefined';
}
alert(y);
}
<button onclick="sety(222)">SET Y to 222</button>
<button onclick="sety(333)">SET Y to 333</button>
<button onclick="gety()">display the Y variable</button>
答案 3 :(得分:0)
您可以按以下方式访问该变量:window.y
,因为您在执行window
时会隐式设置y = x
对象。
这是为了克服未定义变量的问题
function sety(x) {
if (x > 0) y = x;
else alert(window.y);
}
<button onclick="sety(222)">SET Y to 222</button>
<button onclick="sety(333)">SET Y to 333</button>
<button onclick="sety(0)">display the Y variable</button>