Javascriptのドメインとアップグレード


はい、
この文章には、関数と変数の向上の概念が簡単に言及されている.以下では、Javascriptの変数と関数の向上についてもっと詳しく説明します.
一、変数と関数の昇格現象
まず下のコードを考えて実行したら何がプリントされますか?

var foo = 1;
function bar()
{
	if (!foo) 
	{
		var foo = 10;
	}
	alert(foo);
}
bar();
もしこの結果(「10」)があなたを驚かせたら、次の例も同じように驚かせますか?

var a = 1;
function b() 
{
	a = 10;
	return;
	function a() {}
}
b();
alert(a);
そうです.ブラウザは「1」を印刷します.この中で何が起きましたか?これは変に見えます.危ないし、迷っています.
この事実はJavascriptという言語が強大で、表現力のある機能です.以上の現象には標準的な名前がなく、とりあえず「昇格」と呼ばれています.この文章は主にJavascriptのメカニズムを説明しますが、学習が向上する前にまずJavascriptの「領域」を理解してから、より良い理解が向上します.
二、Javascriptのドメイン
Javascriptの初心者にとって、ドメインはJavascriptを学ぶ最大の疑惑であり、実際には多くの熟練したJavascriptの開発者も完全にドメインを理解することができません.領域はJavascriptの中でこのように迷いがあるのは、C民族言語のように見えるからです.以下のC世代コードを考慮します.

#include <stdio.h>
int main() {
	int x = 1;
	printf("%d, ", x); // 1
	if (1) {
		int x = 2;
		printf("%d, ", x); // 2
	}
	printf("%d
", x); // 1 }
以上のコードは順次1,2,1を出力します.これはCおよび他のC民族言語が「ブロックレベルドメイン」を持っているからです.制御文がブロックに入ると、例えばif文ブロックのように、外部の「ドメイン」に影響を及ぼすことなく、このブロックに新しい変数を宣言することができます.しかし、Javascriptではないです.FireFoxで以下のコードを実行してみます.

var x = 1;
console.log(x); // 1
if (true) {
	var x = 2;
	console.log(x); // 2
}
console.log(x); // 2
以上のFireFoxは1,2,2をプリントします.これはJavascriptが「関数レベルドメイン」を持っています.これはC族言語とは根本的に違っています.if文のようなブロックは新しいドメインを形成できません.関数だけが新しいドメインを作成できます.C、C++、CやJavaが好きだった多くのプログラマーにとっては、この現象は望んでいないのも人気がありません.幸いなことに、Javascript関数の柔軟性によって、この現象は補填されます.もし一つの関数の中に臨時ドメインを作成したいなら、次の例を見てください.

function foo() {
	var x = 1;
	if (x) {
		(function () {
			var x = 2;
			// some other code
		}());
	}
	// x is still 1.
}
この方法は実際には非常に柔軟であり、また、文ブロックだけでなく、臨時ドメインを使用する必要がある場所でも使用できる.強くみんなの本当の時間をかけてJavascriptのドメインを理解し、理解することができます.それは非常に強いです.Javascriptのドメインを理解してアップグレードすれば、あなたにとって非常に有意義です.
三、声明、命名と向上
Javascriptでは、名前は一つのドメインで作成されます.次の4つの方法のうちの一つです.
1.言語自体の定義:デフォルトのすべてのドメインにthisとargmentsの二つの名前が与えられます.
2.正式なパラメータ:関数が提供するドメインでは、この関数のパラメータに名前を付けます.
3.関数宣言:関数が提供するドメインは、関数の体内宣言の他の関数に名前を与えます.
4.変数宣言:関数が提供するドメインは、関数の体内宣言の変数に名前を付けます.
関数宣言と変数宣言はしばしばJavascriptインタプリタによって隠し領域の上部に引き上げられます.これはコードのようなものを意味します.

function foo() {
	bar();
	var x = 1;
}
実はこのように解読されています.

function foo() {
	var x;
	bar();
	x = 1;
}
これは変数または関数を宣言する行の文が実行されるかどうかは関係ないということです.どういう意味ですか?以下の二つの関数が等価です.

function foo() {
	if (false) {
		var x = 1;
	}
	return;
	var y = 1;
}
function foo() {
	var x, y;
	if (false) {
		x = 1;
	}
	return;
	y = 1;
}
なお、変数初期化の部分は昇格されていませんが、変数宣言の部分は昇格されています.しかし、関数には2つの形式があります.関数宣言と関数式です.関数式については変数と同じですが、関数宣言に対しては、関数全体を一緒に昇格させます.

function test() {
	foo(); // TypeError "foo is not a function"
	bar(); // "this will run!"
	var foo = function () { // function expression assigned to local variable 'foo'
		alert("this won't run!");
	}
	function bar() { // function declaration, given the name 'bar'
		alert("this will run!");
	}
}
test();
これは昇格の基本原則です.思ったより変で複雑ではないです.レベルアップの本質は
「Javascriptの関数と実行環境」
一つの文章で述べたJavascriptの実行環境の作成問題はただ私達が見ている直観的な現象を昇格させます.昇格させる本質を深く理解するなら、この文を参考にしてください.
良い符号化習慣は、Javascriptの変数がアップグレードされた言語の特徴のために、関数の中で変数をどこでも宣言したら、それは完全に自業自得です.変数はどこで宣言されてもJavascript解释器によって一番上に上げられます.私たちはなぜ直接に関数の一番上で変数や関数を宣言しないのですか?見た目もすっきりしていますし、紛らわしいこともないので、余計なトラブルは避けられます.

/*jslint onevar: true [...] */
function foo(a, b, c) {
	var x = 1,
		bar,
		baz = "something";
}