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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

函数调用的预编译

發布時間:2025/5/22 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 函数调用的预编译 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、前言

上一篇我們說到了腳本的預編譯,這一節講一講函數調用的預編譯。


二、函數調用的預編譯

1. 過程

1.創建活動對象AO(Active Object)

2.預編譯:

  • 產生作用域鏈(scope chain)
  • 初始化arguments
  • 初始化形參,將arguments中的值賦值給形參
  • 找出所有的變量聲明,按照變量名加入AO,如果已存在,忽略。
  • 找出所有的函數聲明,按照函數名加入AO,如果已經存在同名變量或者函數,替換。
  • this初始化

3.解釋執行代碼

2. 解析

1.函數中的所有變量聲明,在函數的預編譯階段完成,所有變量與實際書寫位置無關。

function f() {console.log(aa); // undefinedvar aa = 5;console.log(aa); // 5 } f(); 復制代碼

2.函數中的所有函數聲明,在函數的預編譯階段完成,所有變量的聲明與實際書寫位置無關。

function f() {console.log(haha);function haha() {console.log(123);} } f(); 復制代碼

3.函數中,如果變量與函數同名,那么函數將覆蓋變量。

function f() {console.log(haha);var haha = 123;function haha() {console.log(456);} } 復制代碼

4.函數中,只有函數能覆蓋變量,變量無法覆蓋函數。

function f() {console.log(haha);function haha() {console.log(123);}var haha = 456; } f(); 復制代碼

5.函數中,后面的函數聲明會覆蓋前面的函數聲明,并且忽略參數。

function f() {console.log(haha);function haha(a) {console.log('aaa');}function haha(a, b) {console.log('bbb');} } f(); 復制代碼

6.當函數預編譯后,遇到需要訪問的變量或函數,優先考慮自己AO中定義的變量和函數,如果找不到,才會在其定義的上層AO中尋找,直到到達GO。

var scope = 'global'; function t() {console.log(scope); // undefinedvar scope = 'local';console.log(scope); // local } t(); console.log(scope); // global 復制代碼

三、本節思維導圖

源碼地址:github.com/Knight174/M…

總結

以上是生活随笔為你收集整理的函数调用的预编译的全部內容,希望文章能夠幫你解決所遇到的問題。

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