が今では、警告メッセージ
<!DOCTYPE html>
<html>
<head>
<title>Variable Scope</title>
</head>
<body>
<p>Global and local variable test</p>
<script>
var a = 10;
var b = 10;
function showVars() {
var a = 20;
b = 20;
return "Local variable 'a' = " + a + " \n Global variable 'b' = " + b;
}
var message = showVars();
alert(message + "\n Global variable 'a' = " + a);
</script>
</body>
</html>
変数のスコープ(JavaScriptの)
が表示されますこのコードを実行する。..代わりに `使用を検討して、あるいは単に1行にあなたの文字列を書きます
JavaScriptには、グローバルとローカルの2つのスコープがあります。関数定義の外で宣言された変数はグローバル変数であり、その値はプログラム全体でアクセス可能で変更可能です。関数定義の中で宣言された変数はローカルです。関数が実行されるたびに作成および破棄され、関数外のコードからアクセスすることはできません。 JavaScriptは、ブロックスコープ変数の特別な場合を除いて、ブロックスコープ(中括弧{。。。}が新しいスコープを定義する)をサポートしていません。 JavaScriptの
で
適用範囲は、ローカル変数はグローバル変数と同じ名前を持つことができますが、それは全く別のものです。ある変数の値を変更しても、他の変数には影響しません。ローカルバージョンのみが宣言されている関数内で意味を持ちます。
// Global definition of aCentaur.
var aCentaur = "a horse with rider,";
// A local aCentaur variable is declared in this function.
function antiquities(){
var aCentaur = "A centaur is probably a mounted Scythian warrior";
}
antiquities();
aCentaur += " as seen from a distance by a naive innocent.";
document.write(aCentaur);
// Output: "a horse with rider, as seen from a distance by a naive
innocent."
JavaScriptでは、変数は、スコープの先頭に宣言されているかのように評価されます。ここに示すように、予期しない動作が発生することがあります。 JavaScriptの関数を実行すると、それは最初に、例えば、すべての変数宣言のためするvar someVariableに見える
var aNumber = 100;
tweak();
function tweak(){
// This prints "undefined", because aNumber is also defined locally
below.
document.write(aNumber);
if (false)
{
var aNumber = 123;
}
}
。。これは初期値がで、未定義の変数はです。変数が値で宣言されている場合、たとえばvar someVariable = "something";の場合、最初は値が未定義であり、宣言を含む行が実行されたときにのみ宣言された値をとります。
JavaScriptは、宣言が条件ブロック内にあるかどうかにかかわらず、コードを実行する前にすべての変数宣言を処理します。 JavaScriptがすべての変数を見つけたら、関数内のコードを実行します。変数が暗黙的に関数内で宣言されている場合、つまり代入式の左側に表示され、var-で宣言されていない場合、変数はグローバル変数として作成されます。
JavaScriptでは、内部(ネストされた)関数は、関数が返った後であっても、関数自体と同じスコープ内にあるローカル変数への参照を格納します。この参照セットはクロージャと呼ばれます。次の例では、外部関数の入力パラメータの名前がであるため、内部関数への2番目の呼び出しで最初の呼び出しと同じメッセージ( "Hello Bill")が出力されます内部関数のために。
function send(name) {
// Local variable 'name' is stored in the closure
// for the inner function.
return function() {
sendHi(name);
}
}
function sendHi(msg) {
console.log('Hello ' + msg);
}
var func = send('Bill');
func();
// Output:
// Hello Bill
sendHi('Pete');
// Output:
// Hello Pete
func();
// Output:
// Hello Bill
ブロックスコープの変数
のInternet Explorer 11のブロックスコープの変数である、LETとconstのためのサポートを導入しています。これらの変数については、中括弧{。 。 。}新しいスコープを定義します。これらの変数のいずれかを特定の値に設定すると、その値は設定されているスコープにのみ適用されます。
次の例では、を使用して、とブロックスコープを使用する例を示します。
Note
The following code is supported in Internet Explorer 11 standards mode and
later.
let x = 10;
var y = 10;
{
let x = 5;
var y = 5;
{
let x = 2;
var y = 2;
document.write("x: " + x + "<br/>");
document.write("y: " + y + "<br/>");
// Output:
// x: 2
// y: 2
}
document.write("x: " + x + "<br/>");
document.write("y: " + y + "<br/>");
// Output:
// x: 5
// y: 2
}
document.write("x: " + x + "<br/>");
document.write("y: " + y + "<br/>");
// Output:
// x: 10
// y: 2
文字列は複数行ではありません。 [http://jsbin.com/fumilocogo/1/edit?console]、[改行を削除する](http://jsbin.com/feqohetumi/edit)を使用してください。 ?console) –
return文を1行に移動するだけで、stringを複数行にすることはできません。 https://www.jsnippet.net/snippet/1545/ –
ブラウザコンソールでエラーを読む方法を学ぶことが重要です。ほとんどのエラーのWeb検索は、よく理解するのに役立ちます – charlietfl