JavaScript関数の宣言と変数宣言

免責声明: Declareステートメントをするために使用される宣言定義の識別子(変数名や関数名を)し、値を与えます。

1:VAR変数宣言(5.3.1):

varステートメントは、1つまたは複数の変数を宣言するために使用されます。var name_1 = [= value_1] [ ,..., name_n [= value_n]]

var i;
var j = 0;
var x=1, y=2;
var pi = 3.14,  
f = function(x) {return x*x},  
k = f(x);

2:行方不明の文(3.9節)

JavaScriptエラー:値が宣言されていない変数をお読みください。

(非strictモードで)変数宣言されていない割り当てにJavaScriptが実際に自動的にグローバル変数を宣言してJavaScriptのようなルックスグローバルオブジェクトを作成するために同じ名前の属性です。

x  // => Uncaught ReferenceError: x is not defined *读取一个未声明的变量会报错
x=1  // 给一个未声明的变量赋值,等于创建一个全局变量
x  // => 1。

3:繰り返しの文(3.9節)

変数を宣言するためにvarステートメントを使用して繰り返します法的および無害です。

var v1 = 1
var v1 = 2  // 重复声明带有初始化器,这条语句就像是简单的赋值语句
v1  // => 2var v2 = 1;
var v2  // 重复声明语句不带初始化器,那就什么也不发生
v2  // y的结果是1

4:厳密モード:「使用厳格な」文(5.7.3項)

設計の開始JavaScriptでは、このような宣言されていない変数への代入として、宣言の前にアクセスすることができ、変数はグローバル変数として定義される変数などの批判されるべき多くの課題を残し、それがグローバルスコープを破壊しますプロパティ。

ECMAScript5は厳しい、厳格なモードは重大な欠陥言語を修正し、強力なエラー機能および強化されたセキュリティ・メカニズムを提供し、言語の制限されたサブセットで定義します。

厳密モードでは、宣言されていない変数の割り当てにコードの変数定義を説明する前に、変数を読み取り、文句であろう。

5:関数:関数宣言(5.3.2項)

キーワード機能は、関数を定義するために使用されます。

  • 関数の宣言文
function f(x) { return x + 1; }
  • 関数の定義式
var f = function(x) { return x + 1; }

5.1:関数呼び出し式(呼出し式)(4.5節)

関数呼び出し式:関数式で始まり、式関数は括弧の対に続く、ブラケットは、パラメータのコンマ区切りのリストです。

f()
f(0)
Math.max(x,y,z)

5.2:関数宣言式と関数の宣言書(4.3節、5.1節)

関数の定義式ます。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/function

function [name]([param_1[, param_2[, ..., param_N]]]) {
  [statements]
};

関数宣言します。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/function

function name([param_1,[, param_2,[..., param_N]]]) {
  [statements]
}

関数宣言と関数式ステートメントはほとんど差がなく、唯一の違いは、式で定義された関数(名前)の名前は任意であり、プリコンパイルされたコードのJavaScriptの関数定義部は、主にこれを確認するために、式またはステートメントにコンパイルされロケーション・コードが表示されます。

式(式):意志発現評価するインタプリタJavaScriptの結果(評価)への割り当てがない場合、その結果は、任意の副作用を持っていません。複雑な式は、単純な式の組み合わせによって形成されました。ステートメント(声明):文が起こる何かを実行するために使用され、それは表現の「副作用」を持っています。

声明:直接の関数形式の関数の宣言文の定義に沿って、JSの関数は、関数の宣言文にコンパイルされます。

function f1(x) { return x*x; }  // 这条语句会产生一个副作用,就是定义了一个name为f1的函数。
f1;  // 输出f1,可以看到函数的值。(在JS中,函数也是一个值)
f1(3);  // =>9 当然,你可以用函数调用表达式调用这个函数,输出结果是9

式:

  1. 関数定義は、JavaScriptのコンパイラは通常、表現の関数として定義され、等号の左側に表示されます。
var f2 = function(x){ return x*x; }  // 这个函数定义会被编译为函数定义表达式,计算出的结果再赋值到变量f2。
f2;  // 输出f2,可以看到函数的值。(在JS中,函数也是一个值)
  1. 関数の定義は、括弧内に表示され、通常の式の関数として定義されたJavaScriptコンパイラ:
[1,2,3].map(function(x){ return x*x })  // 定义一个匿名函数
(function(){return 1}())  // 定义一个立即调用函数
(function(){return 1})()  // 同上

これは、コール機能は括弧なしで、すぐに括弧を使用しなければならない理由である、jsがプリコンパイラは、関数の宣言として使用します

  1. 関数の定義は、JavaScriptのコンパイラは通常、表現の関数として定義され、角括弧内に表示されます。
[function(){return 1;}]
  1. アロー関数式:矢印関数表現よりも構文関数式短いです。

JavaScriptで値式を計算し、機能を送信してもよい割り当てることもできる値があるが、式は、副作用の手順起こしません

var f4 = function ff(x){ return x*x; }; ff;  // =>undefined *因为表达式不产生副作用,没有名为ff函数,如果调用ff(),会报错
(function  ff(){return 1})(); ff;  // 同上
[function ff(){return 1;}]; ff;  // 同上

5.3:コンパイル避けjsの原因のエラー、( [ + - /セミコロンが先行

等しい数、括弧、大括弧、矢印関数は式考える。上記の4つの場合があります。

文は、これらの記号で始まる場合、コンパイラは、解析の表現として、それらをJSます、JSが文にセミコロンを終了することはできませんので、それは、問題を作成し、ここでの表現は、文ではないので、この発現と意志のフロント(無セミコロン文)式は、単一の文にマージされています。

例えば、匿名関数が与えられます後のいずれかのステートメントで定義されます。

var a = 1
(function(){ console.log('hello world') })()
// => Error: 1 is not a function

式としてここに匿名関数が解決ので、これはですが、式はステートメントではありません、それは前のステートメントに組み込まれます。もし[共感も。もちろん、私たちは、等号と機能の先頭に矢印で始まっていません。だから、に特別な注意を払う([文章の初めに。ソリューションは、することです(セミコロンの前に。もちろん、多くは、このようなトラブルを避けることができ、それぞれの行の末尾にセミコロンを追加します。

var a = 1
;(function(){ console.log('hello world') })()

似たような状況にもプラス+、マイナスは-、開始文字である/ので、経験し、( [ + - /これらの表現は前の文に属していないことをコンパイラを知ることができるように、文の5つのシンボルの始まりを、注意を払います。

セミコロンは、プログラマがあるようにあなたがいない場合である。すなわち、それは、5つのシンボルの開始前の文にセミコロンを追加する必要があり、あるいはこれらの5つのシンボルを避けるために始めてしまいます。

6:予め宣言(巻き上げ)(セクション3.10.1)

全体の範囲は、可変できることを意味機能のトップは、「プリコンパイルされた」プット・VAR文と関数の宣言文の以前のステートメントではJavaScriptエンジン。しかし、初期化コードのvar宣言が関数の最上部に上昇させることなく、初期化コードの前にアクセス変数は、変数への割り当て値は値が未定義コードの変数宣言される前に、それは通常の割り当てです。

console.log(v3)  // 声明被提前,但在初始化之前访问,不会报错,结果未undefined
var v3 = 1  // “预编译”已经将声明提前,“解释器”运行到此是初始化变量
console.log(v3)  // 在初始化之后访问v3,结果是

コードの前に変数宣言で変数に割り当てた値が通常の代入文でコード文は関数の先頭に置かれているので、文は、欠落していません。

function f(){
  a = 1  // 预编译在代码解释之前完成,当解释器解释到这条赋值语句的时候,预编译已经声明变量a,所以这是一条正常的赋值语句 
  var a  // 声明是预编译完成的,并不是js解释器完成的
}f();
a  // => a is not defined 因为a=1并不是遗漏声明,所以没有创建全局变量

注:変数のコードを呼び出すと、変数を宣言する前に、問題ありませんが、変数にJSが自動的にグローバル変数が、エラーの変数宣言へのアクセスを作成し、行方不明の割り当てを宣言しました。console.log(V4); //キャッチされないのReferenceError:v4が定義されていません

スコープチェーンオブジェクトを見つけることができません文句を言うだろう、プロトタイプチェーンは、プロパティで発見されていないがundfined、ないエラーを返しました。

f1()  // 函数声明也被提前,在定义函数之前就可以调用函数f1
function f1(){return 1;}
function f2(){return ff; function ff(){return 100;}} 
f2()()  // ff的声明被提前,所以返回的ff是一个函数对象

事前に関数宣言文、および関数定義文は進みません。これは、より興味深いです、VAR変数の宣言は、事前になりますが、関数は、時間の初期化式になるように定義され、定義されます。

f3  // 和函数声明语句截然相反,函数表达式的定义并没有提升,f3的值是undefined,
var f3 = function() {return 1;}  // 用函数定义表达式定义一个函数。
function f4(){return ff; var ff = function (){return 100;}}
f4()  // ff声明提前,但表达式定义没有提前,所以返回的ff是一个undefined

@@@ ES2015前に、スコープは、ES2015から始まる、ブロックではありませんVAR、VARのみ関数のスコープとローカルスコープを持つ変数を宣言して、そこのconstをしましょう

おすすめ

転載: www.cnblogs.com/luciolu/p/11956994.html