2017.4.07 js 中的function 实现的方式
函數(shù)分為FD (函數(shù)定義),FE(函數(shù)表達(dá)式) ,函數(shù)構(gòu)造器得到的函數(shù)
(1) ?FD 的栗子:
function getTaste(){
.......
}
解析器遇到上面的function關(guān)鍵字,會(huì)解析上面的代碼為函數(shù)定義的情況,凡是不符合上述格式的,會(huì)報(bào)錯(cuò)。
(2)FE的栗子:
var fn = function (){
......
}
解析器會(huì)把上面的function關(guān)鍵字解析為表達(dá)式的情況。本例中的function后面可有函數(shù)名字,但是僅限于函數(shù)定義內(nèi)調(diào)用。外面調(diào)用會(huì)用fn。
var fn = function sbfn(){
......
sbfn(); ?//
}
把function解析為表達(dá)式的情況,有另外的栗子:
1, function () {
alert('anonymous function is called');
}();
此處為逗號運(yùn)算符情況,取值逗號后面的結(jié)果undefined。
!function () {
alert('ECMAScript');
}();
此處為!運(yùn)算符情況,后面結(jié)果返回undefined 。!取反,結(jié)果為true。
(3)函數(shù)構(gòu)造器的栗子
其主要特點(diǎn)在于這種函數(shù)的[[Scope]]屬性僅包含全局對象(window)
function f() {
var x = 20;
var y = 30;
var bar = new Function('alert(x); alert(y);');
bar(); // 10, "y" 未定義
}
f();
順便提醒一句,Function構(gòu)造器既可使用new 關(guān)鍵字,也可以沒有,這樣說來,這些變體是等價(jià)的。
創(chuàng)建函數(shù)的算法
下面的偽碼描述了函數(shù)創(chuàng)建的算法(與聯(lián)合對象相關(guān)的步驟除外)。這些描述有助于你理解ECMAScript中函數(shù)對象的更多細(xì)節(jié)。這種算法適合所有的函數(shù)類型。
F = new NativeObject();// 屬性[[Class]]是"Function"
F.[[Class]] = "Function"
// 函數(shù)對象的原型是Function的原型
F.[[Prototype]] = Function.prototype
// 醫(yī)用到函數(shù)自身
// 調(diào)用表達(dá)式F的時(shí)候激活[[Call]]
// 并且創(chuàng)建新的執(zhí)行上下文
F.[[Call]] = <reference to function>
// 在對象的普通構(gòu)造器里編譯
// [[Construct]] 通過new關(guān)鍵字激活
// 并且給新對象分配內(nèi)存
// 然后調(diào)用F.[[Call]]初始化作為this傳遞的新創(chuàng)建的對象
F.[[Construct]] = internalConstructor
// 當(dāng)前執(zhí)行上下文的作用域鏈
// 例如,創(chuàng)建F的上下文
F.[[Scope]] = activeContext.Scope
// 如果函數(shù)通過new Function(...)來創(chuàng)建,
// 那么
F.[[Scope]] = globalContext.Scope
// 傳入?yún)?shù)的個(gè)數(shù)
F.length = countParameters
// F對象創(chuàng)建的原型
__objectPrototype = new Object();
__objectPrototype.constructor = F // {DontEnum}, 在循環(huán)里不可枚舉x
F.prototype = __objectPrototype
return F
注意,F.[[Prototype]]是函數(shù)(構(gòu)造器)的一個(gè)原型,F.prototype是通過這個(gè)函數(shù)創(chuàng)建的對象的原型(因?yàn)樾g(shù)語常常混亂,一些文章中F.prototype被稱之為“構(gòu)造器的原型”,這是不正確的)。
轉(zhuǎn)載于:https://www.cnblogs.com/FineDay/articles/6677283.html
總結(jié)
以上是生活随笔為你收集整理的2017.4.07 js 中的function 实现的方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2016 博客导读总结 amp; 个人感
- 下一篇: hdu2609 How many