ホームページ >ウェブフロントエンド >jsチュートリアル >Javascriptのスコープとブロックレベルスコープの違いの詳細な説明

Javascriptのスコープとブロックレベルスコープの違いの詳細な説明

亚连
亚连オリジナル
2018-06-21 17:54:241218ブラウズ

スコープは変数とパラメーターの可視性とライフサイクルを制御するため、どのプログラミング言語でも常に最優先事項です。 JavaScriptのスコープとブロックレベルのスコープを紹介しますので、必要な方は参考にしてください

1. ブロックレベルのスコープの説明

JavaScriptの変数スコープを学ぶ前に、明確にしておく必要があります。いくつかの点 ポイント:

a. JavaScript の変数スコープは、独自のスコープ チェーンに基づいています。

b. JavaScript にはブロックレベルのスコープがありません。

c. 関数内で宣言された変数は、関数全体で定義されます。

JavaScript の変数スコープは、C# のコードなど、一般的に使用される C 系言語とは異なります:

static void Main(string[] args)
{
   if(true)
   {
    int number=10;
   }
  Console.WriteLine(number);
}

「数値が現在のコンテキストに存在しない」ため、このコードはコンパイルできません。

なぜなら、ここでは変数のスコープは中括弧で制限され、ブロックレベルのスコープと呼ばれます。ブロックレベルのスコープでは、定義の先頭から括弧の終わりまで、すべての変数が同じ中括弧内で定義および使用されるため、使用できます。

しかし、JavaScriptにはブロックレベルのスコープという概念がありません。

2. JavaScript のスコープ

1. 関数限定の変数スコープ JavaScript では、関数内で定義された変数には関数内でアクセスできますが、関数外からはアクセスできません。コードの実行中に、変数番号が定義されていないため、関数内で定義された変数は、代入前であっても関数内で任意に使用できます。

この段落 コードの実行後、エラーはスローされず、未定義と 10 の 2 回ポップアップします

2. 子ドメインが親ドメインにアクセスします

この関数は変数の範囲を制限できますの場合、関数内の関数はその役割を持ちます。ドメインのサブドメインでは、サブドメイン内のコードは親ドメインの変数にアクセスできます。コードは次のとおりです。

if(true)
{
  int number=10;
  Console.WriteLine(number);
}

このコードの実行結果は 10 です。ただし、サブドメイン内の親ドメインのコードにアクセスするには条件があります

<script type="text/javascript">
  var num=function()
  {
   var number=10;
  };
  try{
    alert(number);
  }catch(e)
  {
    alert(e);
  } 
</script>
このコードはサブドメイン内にあるので、サブドメインがアクセスしている状況です。親ドメインが変更されました。このコードによって出力される結果は 20 です。このコードは、サブドメインによってアクセスされる num は、親ドメインではなく、サブドメイン内の変数です。 JavaScript で変数を使用する場合、JavaScript インタプリタはまず現在のスコープに変数の定義があるかどうかを検索し、存在しない場合はこの変数を使用します。親ドメインにアクセスして変数を検索するなど、トップレベルのスコープが見つからなくなるまで、「変数が未定義です」という例外がスローされます。 このコードが実行されると、「変数が未定義です」という例外がスローされます。 , 「」を使用すると、20 が表示されます。

以下は、JS スコープとブロックレベルのスコープの紹介です

スコープは、変数とパラメーターの可視性とライフサイクルを制御するため、どのプログラミング言語でも常に最優先されます。そういえば、まずブロックレベルスコープと関数スコープという 2 つの概念を理解してください。 var num=20"取掉,那么打印的就是10.同样去掉"var num=10

ブロックレベルのスコープとは何ですか?

中括弧 ({ と }) のペア内のステートメントのセットはブロックに属し、ブロック内で定義されているすべての変数はコード ブロックの外では見えません。これをブロック レベル スコープと呼びます。

関数のスコープがわかりやすい(*^__^*)関数内で定義されたパラメータや変数は関数の外からは見えません。

ほとんどの C 系言語にはブロックレベルのスコープがありますが、JS にはありません。以下のデモをご覧ください:

<script type="text/javascript">
 var num=function(){
    alert(number);
    var number=10;
    alert(number);
 };
 try{
   num();
 }catch(e){
  alert(e);
 }
</script>
このコードを実行すると、「未定義の変数を使用します:j」というエラーが表示されます。ご覧のとおり、C 言語にはブロック レベルのスコープがあります。これは、 j が if ステートメント ブロック内で定義されているため、ブロックの外からはアクセスできないためです。

JS はどのように動作するのでしょうか? 別のデモを見てみましょう:

<script type="text/javascript">
 var func=function(){
    var number=10;
    var sub_func=function(){
      alert(num);
    };
   sub_func();
};
func();
</script>

このコードを実行すると、ブロックの外で、ブロック内で定義した変数にアクセスできることがわかります。つまり、JS はブロックレベルのスコープをサポートせず、関数スコープのみをサポートし、関数内の任意の場所で定義された変数は関数内の任意の場所で参照できます。

では、JS にブロックレベルのスコープを持たせるにはどうすればよいでしょうか?関数内で定義された変数は、関数が呼び出されるときに破棄されることをまだ覚えていますか? この機能を使用して JS のブロックレベルのスコープをシミュレートできますか?以下のデモをご覧ください:

  function test(){ 
 (function (){ 
 for(var i=0;i<4;i++){ 
 } 
 })(); 
 alert(i); 
} 
test();

这时候再次运行,会弹出"i"未定义的错误,哈哈,实现了吧~~~这里,我们把for语句块放到了一个闭包之中,然后调用这个函数,当函数调用完毕,变量i自动销毁,因此,我们在块外便无法访问了。 

JS的闭包特性is the most important feature((*^__^*) 大家懂的)。在JS中,为了防止命名冲突,我们应该尽量避免使用全局变量和全局函数。那么,该如何避免呢?不错,正如上文demo所示,我们可以把要定义的所有内容放入到一个

(function (){ 
//内容 
})();

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

使用nginx + node如何部署https

在JavaScript中如何实现AOP

在mongoose中有关于更新对象的详细介绍

在JS函数中有关setTimeout详细介绍

使用jquery如何实现侧边栏左右伸缩效果

在Vue中如何实现数字输入框组件

以上がJavascriptのスコープとブロックレベルスコープの違いの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。