JavaScript 関数があり、2 番目のパラメーターがundefinedかどうかを確認したい場合、次のような値を割り当てたいとします。
function myFunc(a,b){
if(typeof b==="undefined" ){
b=0;
}
//do stuff
}
ifブロックの変数bはまだ関数のパラメーターを参照していますか、それともbという名前のグローバル変数が作成されていますか?
乾杯
JavaScript 関数があり、2 番目のパラメーターがundefinedかどうかを確認したい場合、次のような値を割り当てたいとします。
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
@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 されます。
関数のパラメータを参照します。次のように自分自身をテストできます。
var b = 45;
function myFunc(a,b){
if(typeof b==="undefined" ){
b=0;
}
alert( b ); //It will output 0
//do stuff
}
myFunc('');
コード:
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