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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

js处理上下文代码的2个阶段

發布時間:2023/11/29 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js处理上下文代码的2个阶段 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、進入執行上下文

當進入執行上下文(代碼執行之前)時,VO里已經包含了下列屬性(前面已經說了):

函數的所有形參(如果我們是在函數執行上下文中)

— 由名稱和對應值組成的一個變量對象的屬性被創建;沒有傳遞對應參數的話,那么由名稱和undefined值組成的一種變量對象的屬性也將被創建。

所有函數聲明(FunctionDeclaration, FD)

—由名稱和對應值(函數對象(function-object))組成一個變量對象的屬性被創建;如果變量對象已經存在相同名稱的屬性,則完全替換這個屬性。

所有變量聲明(var, VariableDeclaration)

— 由名稱和對應值(undefined)組成一個變量對象的屬性被創建;如果變量名稱跟已經聲明的形式參數或函數相同,則變量聲明不會干擾已經存在的這類屬性。

function test(a, b) {
var c = 10;
function d() {}
var e = function _e() {};
(function x() {});
}

test(10); // call
當進入帶有參數10的test函數上下文時,AO表現為如下: AO(test) = {
a: 10,
b: undefined,
c: undefined,
d: <reference to FunctionDeclaration "d">
e: undefined
};

AO里并不包含函數“x”。這是因為“x” 是一個函數表達式(FunctionExpression, 縮寫為 FE) 而不是函數聲明,函數表達式不會影響VO。
2、執行代碼

alert(x); // function

var x = 10;
alert(x); // 10

x = 20;

function x() {};

alert(x); // 20
為什么第一個alert “x” 的返回值是function,而且它還是在“x” 聲明之前訪問的“x” 的?為什么不是10或20呢?
因為,根據規范函數聲明是在當進入上下文時填入的; 同意周期,在進入上下文的時候還有一個變量聲明“x”,那么正如我們在上一個階段所說,
變量聲明在順序上跟在函數聲明和形式參數聲明之后,而且在這個進入上下文階段,變量聲明不會干擾VO中已經存在的同名函數聲明或形式參數聲明,
因此,在進入上下文時,VO的結構如下 VO = {};

VO['x'] = <reference to FunctionDeclaration "x">

// 找到var x = 10;
// 如果function "x"沒有已經聲明的話
// 這時候"x"的值應該是undefined
// 但是這個case里變量聲明沒有影響同名的function的值

VO['x'] = <the value is not disturbed, still function>

轉載于:https://www.cnblogs.com/ftxc/p/8404969.html

總結

以上是生活随笔為你收集整理的js处理上下文代码的2个阶段的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。