让我们假设我们有一个javascript函数,我们想检查第二个参数是否是 undefined ,在这种情况下我们要为它分配一个值,例如
function myFunc(a,b){
if(typeof b==="undefined" ){
b=0;
}
//do stuff
}
if 块中的变量 b 是否仍然引用函数的参数或者创建名为 b 的全局变量?
干杯
答案 0 :(得分:3)
是的,b
分别在lexicalEnvironment
(ES5)Activation Object
(ES3)中得到解决。它将始终在本地解析,即使存在全局变量b
以及访问纯名称也是如此。
您需要分别显式调用window.b
global.b
(节点)来访问具有相同名称的全局变量。
答案 1 :(得分:2)
它指的是函数的参数。你可以像这样测试自己:
var b = 45;
function myFunc(a,b){
if(typeof b==="undefined" ){
b=0;
}
alert( b ); //It will output 0
//do stuff
}
myFunc('');
答案 2 :(得分:2)
@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将首先扫描被调用函数的范围,对于所使用的任何变量,如果它没有在那里找到它,它将移动到外部范围。这可以是另一个功能,或者最终是全局范围。在此示例中,内部(返回)函数将无法访问外部函数中定义的a
的值。当外部函数返回时,它是GC'ed,因为它没有被引用到任何地方。
答案 3 :(得分:1)
代码:
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
答案 4 :(得分:1)
Javascript首先在本地范围内查找局部变量或命名函数参数。如果它在那里找到符号,那么该变量就是使用的那个。
仅当找不到匹配的本地符号时才使用全局符号。
因此,在您的示例中,您将设置b
函数参数的值。
一旦在局部变量或命名函数参数中定义了本地符号,就不能再使用该名称来访问同名的全局变量。如果您特别想要解决全局变量,可以在window.
前加window.b
作为前缀。这专门针对全局范围,因此不使用本地范围。
答案 5 :(得分:1)
变量保留在函数if;
var
或不使用变量用this
声明,因为它的父节点是函数,例如
function foo(){
this.bar = 'hello';
}
使用var
或不使用window
声明变量在任何函数之外声明
声明变量,因为它的父节点是window.bar ='i am global'
示例
{{1}}
答案 6 :(得分:-1)
你需要全球定义变量:
在下面的代码中,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>
REF: http://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_undefined