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