昇降機構
JavaScript の変数宣言にはホイスティング メカニズムがあり、JavaScript エンジンが実行されると、すべての変数宣言が現在のスコープの先頭に引き上げられます。
最初にコードの一部を確認してください
var v = "hello"; (function(){ console.log(v); var v = "world"; })();
このコードを実行すると結果はどうなりますか?
答えは次のとおりです: 未定義
このコードは 2 つの問題を示しています。
まず、関数スコープ内の変数 v は、上位スコープ変数 v をカバーします。コードへの変更を少なくします
var v = "hello"; if(true){ console.log(v); var v = "world"; }
出力結果は「hello」で、JavaScript にブロックレベルのスコープがないことを示しています。関数は、独自のスコープを持つ JavaScript の唯一の構造です。
2 番目に、関数スコープ内で変数 v の宣言がプロモートされます。したがって、最初のコードは次と同等です:
var v = "hello"; (function(){ var v; //declaration hoisting console.log(v); v = "world"; })();
宣言、定義、初期化
宣言は名前の存在を宣言し、定義は名前に記憶領域を割り当て、初期化は名前によって割り当てられた記憶領域に初期値を割り当てます。
C を使用してこれら 3 つの概念を表現します
extern int i;//これは、名前 i がすでにどこかに存在することを示すステートメントです
int i;//これは、名前 i を宣言して定義し、i
に記憶領域を割り当てます。
i = 0;//これは初期化名 i で、初期値 0
が割り当てられます。
これは JavaScript の場合です
var v;//変数 v を宣言
v = "hello";//変数 v
を (定義して) 初期化します
JavaScript は動的言語であるため、その変数の型は固定されておらず、その記憶領域のサイズは初期化と代入によって変化します。したがって、その変数の「定義」は従来の静的言語のそれと同じではありません。その定義は無関係です。
昇格宣言
現在のスコープ内の宣言は、変数や関数の宣言を含め、スコープの先頭に昇格されます
(function(){ var a = "1"; var f = function(){}; var b = "2"; var c = "3"; })();
変数 a、f、b、c の宣言は、次のように関数スコープの先頭に昇格されます:
(function(){ var a,f,b,c; a = "1"; f = function(){}; b = "2"; c = "3"; })();
関数式はプロモートされないことに注意してください。これが関数式と関数宣言の違いでもあります。 2 つの違いを詳しく見てみましょう:
(function(){ //var f1,function f2(){}; //hoisting,被隐式提升的声明 f1(); //ReferenceError: f1 is not defined f2(); var f1 = function(){}; function f2(){} })();
上記コードの関数宣言 f2 はプロモートされているので、f2 を先に呼び出しても問題ありません。変数 f1 もプロモートされますが、プロモート後の f1 の値は不定であり、関数式の実行時に実際の初期値が代入されます。したがって、ステートメントのみがプロモートされます。
名前解決の順序
JavaScript の名前は 4 つの方法でスコープに入ります。その優先順位は次のとおりです。
1. 組み込み言語: すべてのスコープに this および argument キーワードが含まれます
2. 仮パラメータ: 関数のパラメータは関数スコープ
内で有効です。
3. 関数宣言: 関数 foo() {}
の形で
4. 変数宣言: var bar;
名前宣言の優先順位は上に示したとおりです。つまり、変数の名前が関数の名前と同じ場合、その順序に関係なく、関数の名前が変数の名前をオーバーライドします。コードの中で。ただし、名前はコードに記述された順序で初期化され、上記の優先順位の影響を受けません。コードを見てください:
(function(){ var foo; console.log(typeof foo); //function function foo(){} foo = "foo"; console.log(typeof foo); //string })();
仮パラメータに同じ名前の変数が複数ある場合、同じ名前の最後のパラメータが定義されていない場合でも、同じ名前の最後のパラメータが同じ名前の他のパラメータを上書きします。
上記の名前解決の優先順位には、言語の組み込みの名前引数をオーバーライドする機能などの例外があります。
名前付き関数式
関数式には関数宣言と同じように名前を付けることができますが、これでは関数式が関数宣言になるわけではありません。名前付き関数式の名前はネームスペースに入らず、昇格されません。
f();//TypeError: f は関数ではありません
foo();//ReferenceError: foo が定義されていません
var f = function foo(){console.log(typeof foo);};
f();//関数
foo();//ReferenceError: foo が定義されていません
名前付き関数式の名前は、関数のスコープ内でのみ有効です。
次の例を見てみましょう:
var myval = "my global var"; (function() { console.log(myval); // log "my global var" })();
上記のコードは明らかに「my global var」を出力しますが、上記のコードを次のように少し変更すると、
var myval = "my global var"; (function() { console.log(myval); // log "undefined" var myval = "my local var"; })();
実行結果は未定義が出力されます。これは、上記のコードが次のコードと同等であるためです。
var myval = "my global var"; (function() { var myval; console.log(myval); // log "undefined" myval = "my local var"; })();
ただし、この昇格メカニズムは通常の変数だけでなく関数にも反映されます。たとえば、次のコードは正しく実行できません:
(function() { fun(); // Uncaught TypeError: undefined is not a function var fun = function() { console.log("Hello!"); } })();
(function() { var fun; fun(); // Uncaught TypeError: undefined is not a function fun = function() { console.log("Hello!"); } })();
もちろん、このような関数の定義方法を「関数式」と呼び、次のような「関数宣言」方式であれば昇格機構は全く問題ありません。
(function() { fun(); function fun() { console.log("Hello!"); // log "Hello!" } })();
これは、関数宣言と関数式の主な違いでもあります。

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

WebStorm Mac版
便利なJavaScript開発ツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

ホットトピック



