目次
JS 変数には、基本データ型 (値型) と参照データ型 (複合データ型) の 2 つの異なるデータ型が含まれています。
次に、基本データ型と参照型の比較をそれぞれ見てみましょう
関数のパラメータとしての基本型と参照型の問題を見てみましょう
最後にスコープについて話しましょう! JS 変数のスコープとは、変数の影響を受けるスコープを指します。 JSのスコープはグローバルスコープとローカルスコープ(関数スコープ)に分かれます。グローバル スコープで定義された変数はグローバル変数であり、ローカル スコープで定義された変数はローカル変数です。
变量的生命周期
ホームページ ウェブフロントエンド jsチュートリアル JavaScriptの変数とスコープの詳しい説明

JavaScriptの変数とスコープの詳しい説明

Jun 11, 2018 pm 05:47 PM
javascript

天安門、紫禁城、万里の長城に行ったことがないということは、北京に行ったことがないということになります。 JS の変数のスコープを理解していないと、JS を学習していないのと同じです。 JS 変数スコープの重要性を自分で学びましょう。ヒント: この記事を読むときは、必ずコメントを読んでください。

JS は弱く型付けされた (緩やかに型付けされた) 言語です。つまり、本質的に異なり、独自のものです。
変数スコープを説明する前に、まずJSの変数について理解しましょう。 JS の変数は他の言語とは大きく異なります。JS 変数は緩やかな (必須ではない) 性質を持っているため、特定の段階で特定のタイプの値を保持する名前にすぎません。

JS 変数には、基本データ型 (値型) と参照データ型 (複合データ型) の 2 つの異なるデータ型が含まれています。

基本データ型の値はスタックメモリに保存されます。参照データ型の値はヒープ メモリに格納され、参照データ型のポインタ アドレスのみがスタック メモリに保持されます。
値には 5 つの基本的なタイプがあります: 未定義、Null、ブール、数値、文字列です。基本データ型の値はスタック メモリに格納されます。

//在栈内存中开辟一块空间存储值为"laotie"的变量namevar name="laotie";//在栈内存中开辟一块空间存储值为"laotie"的变量name2var name2=name;//name与name2是相对独立的,所以改变name2的值为"xiaozhang",而name的值不会受到影响var name2="xiaozhang";
console.log(name);//laotieconsole.log(name2);//xiaozhang
ログイン後にコピー

参照型をもう一度見てみましょう:

/*在栈内存中存放 obj的地址
* 其值存放在堆内存中。
* 栈内存的地址的指向堆内存中的值。*/var obj={
    name:"zhangpeiyue"}/*将obj的地址赋值给obj2
所以在栈内存中存储的地址与obj的地址相同,
obj与obj2共享同一个值。
*/var obj2=obj;
obj2.name="xiaozhang";//因为obj与obj2共享同一个值,所以上行代码改变的是同一个值console.log(obj.name);//xiaozhang
 //你也可以认为obj即为obj2,引用类型比较的是地址,因此为trueconsole.log(obj==obj2);//true
ログイン後にコピー
次に、基本データ型と参照型の比較をそれぞれ見てみましょう
  • 基本データ型の比較、比較は値です:

//基本数据类型比较的是值,只要值相等比较结果即为truevar a=1;var b=1;console.log(a==b);//truevar c=2;var d=c;console.log(c==d);//true
ログイン後にコピー
  • 参照型 比較、比較はアドレスです:

var obj={
    age:12}var obj2={
    age:12}//引用类型比较的是地址,而不是值。//由于每次创建的引用类型地址都不同,所以结果为falseconsole.log(obj==obj2);//falsevar obj3={
    age:12}//将obj3的地址赋值给obj4。所以地址相同var obj4=obj3;//由于比较的是地址,且obj3与obj4的地址相同,所以结果为trueconsole.log(obj3==obj4);
ログイン後にコピー
関数のパラメータとしての基本型と参照型の問題を見てみましょう
  • 基本型はパラメータとして使用され、パラメータはローカル変数です

/*接收的所有基本数据类型,接收的是其值。
接收的参数都是函数体中的局部变量。
在函数体内改变值,对外部不会产生任何影响*/function fn(a){
    a+=1;
    console.log(a);//14}
var a=13;fn(a);
console.log(a);//13
ログイン後にコピー
  • 参考データ型はパラメータとして使用され、パラメータはグローバル変数です

/*引用数据类型传递的是引用地址,
因此函数体中的obj与函数外的obj的引用地址相同。
所以函数体中的obj与函数外的obj共享同一值,
改变其中一个值,其它的也会随之改变
*/function fn(obj){
    obj.name="laowang"
    console.log(obj.name);//laowang}
var obj={
    name:"laotie"}fn(obj);
console.log(obj.name);//laowang
ログイン後にコピー
最後にスコープについて話しましょう! JS 変数のスコープとは、変数の影響を受けるスコープを指します。 JSのスコープはグローバルスコープとローカルスコープ(関数スコープ)に分かれます。グローバル スコープで定義された変数はグローバル変数であり、ローカル スコープで定義された変数はローカル変数です。

グローバル スコープは、Web ブラウザーで最も周辺的に定義されたスコープであり、ウィンドウ オブジェクトを指します。したがって、グローバル スコープで定義された変数と関数は、ウィンドウ オブジェクトのプロパティとメソッドとして考えることができます。

var color="red";//定义一个全局colorfunction fn(){
    color="blue";//全局函数可以在函数内访问}fn();
console.log(color);//blue
ログイン後にコピー
  • グローバル変数と関数はすべて window オブジェクトの属性とメソッドです。

var color="red";//定义一个全局colorfunction fn(){    color="blue";//全局函数可以在函数内访问}window.fn();
console.log(window.color);//blue
ログイン後にコピー
  • 関数スコープで宣言された変数は、パラメータを渡すことでグローバルスコープで宣言された変数と同じ名前になります

var color="yellow";//定义全局变量colorfunction fn(){    //在函数体内如果拥有指定的变量,就不会去外层查找
    var color="red";//这里是局部变量color,外面是访问不到的哦
    console.log(color);//red}fn();
console.log(color);//yellow
ログイン後にコピー
  • 。渡されるパラメータは基本型であり、パラメータは関数本体のローカル変数です。渡されるパラメータは参照型であり、パラメータは関数本体内のグローバル変数です。記事の冒頭で説明したので、ここでは説明しません。

  • 関数本体にサブ関数がある場合、その関数のみがサブ関数にアクセスできます。

var color="green";function fn(){
    //子函数是建议以下划线开头
    function _fn2(){
        var color2="orange";
        console.log(color);//green
        console.log(color2);//orange
    }
    _fn2();//_fn2()的作用域在fn()内}
fn();
_fn2();//在此处调用fn2()是调取不到的
ログイン後にコピー

注: コードがスコープ内で実行される場合、スコープ チェーンと呼ばれるものが存在します。その役割は、変数とメソッドへのアクセスの順序性を確保することです。つまり、現在の実行環境に指定された変数やメソッドが存在する場合は周辺検索を行わず、存在しない場合は見つかるまで周辺検索を行います。見つからない場合は、エラーが報告されます。指定された変数とメソッドをレイヤーごとに検索する動作により、一連の操作が形成されます。このチェーンがスコープ チェーンです。ローカル変数へのアクセスは、指定された変数を外部から探す (ルックアップする) 必要がないため、グローバル変数よりもはるかに高速です。
* JS にはブロックレベルのスコープがありません。いわゆるブロックレベルのスコープは、if、for、その他のステートメントの中括弧で囲まれたコードを指します。

if(true){    var name="zhang";
}
console.log(name);//zhang
ログイン後にコピー

関数内で var キーワードを使用せずに変数を宣言すると、その変数はグローバル変数になります。ただし、この動作は名前の競合を引き起こしやすいため、すべての人に使用することはお勧めできません。

function fn(){    //此处a=12相当于window.a=12。
    a=12;//声明一个不带var关键字的变量}fn();
console.log(a);//12
ログイン後にコピー

これは、fn 関数がウィンドウ環境で実行されるため、関数本体の a=12 は window.a=12 を実行することと同じになります。そして window は JS の最上位オブジェクトです。値 12 の属性をトップレベルのオブジェクトに追加したと考えることもできます。したがって、変数 a はグローバル変数になります。
さらに、関数本体内の変数が var キーワードを通じて宣言されている場合、その変数はローカル変数となり、関数本体内でのみアクセスでき、関数本体外からはアクセスできません。

function fn(){
    var a=12;
    console.log(a);//12}fn();
console.log(a);//报错:a is not defined
ログイン後にコピー
  • スコープに関する Alibaba からのインタビューの質問を共有します:

var obj = {
    b: 2};var fn = function () {};
fn.c = 3;function test(x, y, z) {
    x = 4;
    y.b = 5;
    z.c = 6;    return z;
}
test(a, obj, fn);
console.log(a + obj.b + fn.c);//12
ログイン後にコピー
变量的生命周期

所谓变量的生命周期指的是变量由声明到销毁。
对于全局变量来讲,其生命周期是永久的,除非我们主动去销毁这个全局变量。而在函数体内声明的局部变量,当函数运行完以后,局部变量就失去了任何价值,它们也会随着函数的执行完毕而销毁。

var fn=function(){
    var a=1;//退出函数后,局部变量a会销毁
    console.log(a);
}fn();
ログイン後にコピー
  • JS环境中分配的内存一般有如下生命周期
    内存分配:当我们声明变量、函数、对象的时候,系统会自动为他们分配内存
    内存使用:即读写内存,也就是使用变量、函数等
    内存回收:使用完毕,由垃圾回收自动回收不再使用的内存 

  • 本文讲解了JavaScript的变量及作用域,更多相关内容请关注php中文网。

  • 相关推荐:

  • 关于$.ajax()方法参数详解

  • 讲解数学对象Math相关内容

  • 关于JS和JSP的区别讲解

以上がJavaScriptの変数とスコープの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 Dec 17, 2023 pm 02:54 PM

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 Dec 17, 2023 pm 12:09 PM

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 Dec 17, 2023 am 09:39 AM

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

JavaScriptでinsertBeforeを使用する方法 JavaScriptでinsertBeforeを使用する方法 Nov 24, 2023 am 11:56 AM

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと参照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

JavaScript で HTTP ステータス コードを簡単に取得する方法 JavaScript で HTTP ステータス コードを簡単に取得する方法 Jan 05, 2024 pm 01:37 PM

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具体的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが

See all articles