function 構文と function リテラルの違い
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ リテラルで作って代入する方法では無名関数に名前つけれる
◆ 名前つけると関数内からその関数自身への参照を持てる
◆ 上書きできないし 関数を別の変数に代入しても自分自身への参照はずっと維持される
◆ 構文だと名前はつけれるけど関数名で参照を持ってない
◆ 別の変数に代入して元の変数に違う値が入ると使えなくなる
◆ 名前つけると関数内からその関数自身への参照を持てる
◆ 上書きできないし 関数を別の変数に代入しても自分自身への参照はずっと維持される
◆ 構文だと名前はつけれるけど関数名で参照を持ってない
◆ 別の変数に代入して元の変数に違う値が入ると使えなくなる
この記事で書いたことですが無名関数を使うときは 関数名設定しておくと別の変数に代入しても自分自身の参照を維持できます
また この関数名の変数は書き換え不可能です
関数名をつけるとプロパティ name にもちゃんと名前がついています
ところで構文で定義すると
なので 構文でつくるということは 無名関数に名前つけて定義してそれと同じ名前の変数に代入するのをスコープの最初にするということかな
と思ったわけです
じゃあこれはできるはず
ダメでした
構文で定義すると 定義した時の名前で関数内でその関数への参照が作られないようです
自分自身を参照する可能性があるなら名前付き無名関数のほうがいいですね
実際 JavaScript の関数構文って 関数の宣言する順番を気にしなくていいとこ以外に使う利点ないですよね
funciton 構文で作って自身を参照するなら arguments.callee を使ってください
bind しないと this 変わるしあんまり使いたくないですけどね
var fn_exp1 = function(){
console.log(fn_exp1.name)
}
var fn = fn_exp1
fn_exp1 = null
fn()
Uncaught TypeError: Cannot read property 'name' of null(…)
console.log(fn_exp1.name)
}
var fn = fn_exp1
fn_exp1 = null
fn()
Uncaught TypeError: Cannot read property 'name' of null(…)
var fn_exp2 = function fn_exp2(){
console.log(fn_exp2.name)
}
var fn = fn_exp2
fn_exp2 = null
fn()
// fn_exp2
下の fn_exp2 では リテラルに名前をつけているので代入する変数は関係なく 関数内から見えるスコープに fn_exp2 が自分として存在するわけですconsole.log(fn_exp2.name)
}
var fn = fn_exp2
fn_exp2 = null
fn()
// fn_exp2
また この関数名の変数は書き換え不可能です
var a
function b(){b = 1}
a = b
a()
b // 1
var c = function c(){c = 1}
a = c
a()
c // function c(){c = 1}
このように 外側に影響させることはできないですfunction b(){b = 1}
a = b
a()
b // 1
var c = function c(){c = 1}
a = c
a()
c // function c(){c = 1}
関数名をつけるとプロパティ name にもちゃんと名前がついています
var fa = function (){}
var fb = function fn(){}
fa.name // ""
fb.name // fn
var fb = function fn(){}
fa.name // ""
fb.name // fn
ところで構文で定義すると
function func_stm(){}
var fn = func_stm
fn.name // func_stm
関数名はちゃんと存在しますvar fn = func_stm
fn.name // func_stm
なので 構文でつくるということは 無名関数に名前つけて定義してそれと同じ名前の変数に代入するのをスコープの最初にするということかな
と思ったわけです
じゃあこれはできるはず
function fn_stm(){console.log(fn_stm.name)}
var fn = fn_stm
fn_stm = null
fn()
Uncaught TypeError: Cannot read property 'name' of null(…)
エラーvar fn = fn_stm
fn_stm = null
fn()
Uncaught TypeError: Cannot read property 'name' of null(…)
ダメでした
構文で定義すると 定義した時の名前で関数内でその関数への参照が作られないようです
自分自身を参照する可能性があるなら名前付き無名関数のほうがいいですね
実際 JavaScript の関数構文って 関数の宣言する順番を気にしなくていいとこ以外に使う利点ないですよね
funciton 構文で作って自身を参照するなら arguments.callee を使ってください
bind しないと this 変わるしあんまり使いたくないですけどね