考慮這些腳本片段。在JavaScript中查找調用者腳本?
<script data-name="script1">
foo();
</script>
<script data-name="script2">
foo();
</script>
<script>
function foo(){
// console.log(arguments.?);
}
</script>
有沒有辦法找到哪個腳本函數foo被稱爲「/」的行?
考慮這些腳本片段。在JavaScript中查找調用者腳本?
<script data-name="script1">
foo();
</script>
<script data-name="script2">
foo();
</script>
<script>
function foo(){
// console.log(arguments.?);
}
</script>
有沒有辦法找到哪個腳本函數foo被稱爲「/」的行?
正如評論中提到的那樣,這是不可能的,它只適用於函數foo
被函數調用的情況,當然這對於每個腳本必須是不同的函數,然後你可以使用
console.log(arguments.callee.caller.name)
這會給你一個叫做你的函數foo的函數的名字。
編輯:真的,如果知道腳本的調用位置很重要,只需使用一個參數,如function foo(caller){
,它指示函數的調用方式,這比依靠arguments.callee.caller
更安全。
我在考慮包裝,但它只是返回匿名函數。 (I.e. name =「」)對於編輯而言,必須爲每個函數調用標識,這正是我爲什麼要透明化的原因。 – user1277170
**警告**:第5版ECMAScript(ES5)禁止在[strict模式]中使用'arguments.callee()'(https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode)。 [查看原因](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments/callee?redirectlocale=zh-CN&redirectslug=JavaScript%2FReference%2FFunctions_and_function_scope%2Farguments%2Fcallee#Why_was_arguments .callee_removed_from_ES5_strict_mode.3F) – Oriol
我完全同意Oriol,這就是爲什麼在開發過程中我只使用'arguments.callee'來調試你的腳本(在這種情況下,我假定它只用於控制檯日誌)。至於匿名函數,是的,這是行不通的,唯一的方法就是查看你正在使用的對象的一些獨特屬性,或者通過在函數調用中使用一個參數。 – rolfv1
好吧,我想通了,這會搶了腳本數據-name屬性
function foo() {
var parentScript = document.body.lastChild;
console.log(parentScript.getAttribute('data-name'));
}
爲了得到它的工作,我不得不定義調用它上面的富功能,但我敢肯定有些玩家可以解決這個問題。
不知道爲什麼這是downvoted ... jQuery的依賴?會喜歡關於那個 –
的一些闡述是不是我,但雖然這本質上可能在技術上是正確的,但它只適用於DOM加載。一旦加載,它將始終返回最後一個腳本。 – user1277170
公平不錯,這是我最好的猜測; @zzzzBov發佈的鏈接可能是一個更好的解決方案 –
答案將是「否」。 – epascarello
不,因爲函數不包含有關它們在其中定義的腳本標記的信息。你有什麼用途呢?也許你只需要一種不同的方法來實現你的目標 –
@RobM。我在腳本和對象之間有1:1的關係,並且希望能夠有一個全局的,透明的函數來映射。 (而不是每個腳本都必須映射自己。) – user1277170