2013-11-20 31 views
1

考慮這些腳本片段。在JavaScript中查找調用者腳本?

<script data-name="script1"> 
    foo(); 
</script> 

<script data-name="script2"> 
    foo(); 
</script> 

<script> 
    function foo(){ 
//  console.log(arguments.?); 
    } 
</script> 

有沒有辦法找到哪個腳本函數foo被稱爲「/」的行?

+1

答案將是「否」。 – epascarello

+4

不,因爲函數不包含有關它們在其中定義的腳本標記的信息。你有什麼用途呢?也許你只需要一種不同的方法來實現你的目標 –

+0

@RobM。我在腳本和對象之間有1:1的關係,並且希望能夠有一個全局的,透明的函數來映射。 (而不是每個腳本都必須映射自己。) – user1277170

回答

1

正如評論中提到的那樣,這是不可能的,它只適用於函數foo被函數調用的情況,當然這對於每個腳本必須是不同的函數,然後你可以使用

console.log(arguments.callee.caller.name) 

這會給你一個叫做你的函數foo的函數的名字。

編輯:真的,如果知道腳本的調用位置很重要,只需使用一個參數,如function foo(caller){,它指示函數的調用方式,這比依靠arguments.callee.caller更安全。

+0

我在考慮包裝,但它只是返回匿名函數。 (I.e. name =「」)對於編輯而言,必須爲每個函數調用標識,這正是我爲什麼要透明化的原因。 – user1277170

+4

**警告**:第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

+0

我完全同意Oriol,這就是爲什麼在開發過程中我只使用'arguments.callee'來調試你的腳本(在這種情況下,我假定它只用於控制檯日誌)。至於匿名函數,是的,這是行不通的,唯一的方法就是查看你正在使用的對象的一些獨特屬性,或者通過在函數調用中使用一個參數。 – rolfv1

0

好吧,我想通了,這會搶了腳本數據-name屬性

function foo() { 
    var parentScript = document.body.lastChild; 
    console.log(parentScript.getAttribute('data-name')); 
} 

爲了得到它的工作,我不得不定義調用它上面的富功能,但我敢肯定有些玩家可以解決這個問題。

+1

不知道爲什麼這是downvoted ... jQuery的依賴?會喜歡關於那個 –

+0

的一些闡述是不是我,但雖然這本質上可能在技術上是正確的,但它只適用於DOM加載。一旦加載,它將始終返回最後一個腳本。 – user1277170

+0

公平不錯,這是我最好的猜測; @zzzzBov發佈的鏈接可能是一個更好的解決方案 –