日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2017.4.07 js 中的function 实现的方式

發(fā)布時(shí)間:2024/7/19 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2017.4.07 js 中的function 实现的方式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

函數(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)

var x = 10;

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。