W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
injector ,我從 ng 的文檔中得知這個概念,之后去翻看源碼時了解了一下這個機制的工作原理。感覺就是雖然與自己的所想僅差那么一點點,但就是這么一點點,讓我感慨想象力之神奇。
先看我們之前代碼中的一處定義:
app.controller('BoxCtrl', function($scope, $element){});
在這個函數(shù)定義中,注意那兩個參數(shù): $scope , $element ,這是兩個很有意思的東西??偟膩碚f,它們是參數(shù),這沒什么可說的。但又不僅僅是參數(shù)——你換個名字代碼就不能正常運行了。
事實上,這兩個參數(shù),除了完成“參數(shù)”的本身任務(wù)之外,還作為一種語法糖完成了“依賴聲明”的任務(wù)。本來這個函數(shù)定義,完整的寫法應(yīng)該像 AMD 聲明一樣,寫成:
app.controller('BoxCtrl', [ '$scope', '$element', function($scope, $element){} ] );
這樣就很明顯,表示有一個函數(shù),它依賴于兩個東西,然后這兩個東西會依次作為參數(shù)傳入。
簡單起見,就寫成了一個函數(shù)定義原本的樣子,然后在定義參數(shù)的名字上作文章,來起到依賴聲明的作用。
在處理時,通過函數(shù)對象的 toString() 方法可以知道這個函數(shù)定義代碼的字符串表現(xiàn)形式,然后就知道它的參數(shù)是 $scope 和 $element 。通過名字判斷出這是兩個外部依賴,然后就去獲取資源,最后把資源作為參數(shù),調(diào)用定義的函數(shù)。
所以,參數(shù)的名字是不能隨便寫的,這里也充分利用了 js 的特點來盡量做到“反省”了。
在 Python 中受限于函數(shù)名的命名規(guī)則,寫出來不太好看。不過也得利于反省機制,做到這點也很容易:
# -*- coding: utf-8 -*- def f(Ia, Ib): print Ia, Ib args = f.func_code.co_varnames SRV_MAP = { 'Ia': '123', 'Ib': '456', } srv = {} for a in args: if a in SRV_MAP: srv[a] = SRV_MAP[a] f(**srv)
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: