假设我们有一个 javascript 函数,我们想检查第二个参数是否未定义,在这种情况下,我们想为它分配一个值,例如
function myFunc(a,b){
if(typeof b==="undefined" ){
b=0;
}
//do stuff
}
if块中的变量b是否仍然引用函数的参数或创建了一个名为b的全局变量?
干杯
假设我们有一个 javascript 函数,我们想检查第二个参数是否未定义,在这种情况下,我们想为它分配一个值,例如
function myFunc(a,b){
if(typeof b==="undefined" ){
b=0;
}
//do stuff
}
if块中的变量b是否仍然引用函数的参数或创建了一个名为b的全局变量?
干杯
是的,分别在(ES5)(ES3)b
中得到解决。即使通过访问纯名称也存在全局变量,它也将始终在本地解析。lexicalEnvironment
Activation Object
b
您需要window.b
分别显式调用global.b
(节点)以访问具有相同名称的全局变量。
它指的是函数的参数。你可以像这样测试自己:
var b = 45;
function myFunc(a,b){
if(typeof b==="undefined" ){
b=0;
}
alert( b ); //It will output 0
//do stuff
}
myFunc('');
@Andre 和 @Nelson 的答案都是正确的,但只是为了清楚起见:
var c = 123;
var func = (function(a)//a === 1234
{
var b = c;//local b === global c
return function(a,c)
{
console.log(c === b);//false, unless second argument was 123
console.log(a === 1234);//false, unless first arg was 1234
console.log('a masks the a of the outer scope');
};
})(1234);
JS 将首先扫描被调用函数的范围,对于任何使用的 var,如果它没有在那里找到它们,它会移动到外部范围。这可以是另一个函数,或者最终是全局范围。在此示例中,内部(返回)函数将无法访问a
外部函数中定义的值。当外部函数返回时,它被 GC 处理,因为它没有在任何地方被引用。
代码:
function myFunc(a,b){
if(typeof b==="undefined" ){
b=0;
}
console.log('b from myFunc:'+b)
}
myFunc(5);
console.log('global:'+b)
输出:
b from myFunc:0
b is not defined
Javascript 首先在局部范围内查找局部变量或命名函数参数。如果它在那里找到符号,则该变量就是使用的变量。
仅当未找到匹配的局部符号时才使用全局符号。
因此,在您的示例中,您将设置b
函数参数的值。
一旦在局部变量或命名函数参数中定义了局部符号,就不能再单独使用该名称来访问同名的全局变量。如果您特别想处理全局变量,可以通过在其前面加上window.
as in 来实现window.b
。这专门针对全局范围,因此不使用本地范围。
变量保留在函数上,如果;
var
使用或不使用它在函数内部声明变量变量被声明this
为它的父节点函数,下面的例子
function foo(){
this.bar = 'hello';
}
变量在全局范围内可用时
var
变量在使用或不使用它的任何函数之外声明
该变量被声明为它的父节点是window
下面的例子
window.bar ='i am global'
您需要在全球范围内定义变量:
在下面的代码中 t2 是未定义的。
<script>
var t1="";
var t2;
function check(t1,t2){
if (t1===undefined)
{
alert("t1 is undefined");
}
if (t2===undefined)
{
alert("t2 is undefined");
}
}
</script>
参考: http ://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_undefined