[英]how to access function caller context?
我正在嘗試了解javascript范圍,並且想知道是否在以下示例中:
// B can access 'context'
var a = function (context) {
b = function () {
console.log(context);
};
b();
};
a('nicccce'); // works!
// C can't access 'context'
var d = function () {
console.log(context);
};
var c = function (context) {
d();
};
c('oh oh'); // breaks
有沒有一種方法可以從“ d”功能訪問“上下文”?
編輯:
我知道我可以將參數傳遞給d函數,這顯然是理智的事情,但是我想知道是否還有另一種方法可以使用this.callee
作為this.callee.arguments[0]
。
你可以
1)就像將c
和a
一樣,將context
傳遞給d
。 要么
2)將context
放入d
的詞法范圍。
選項2聽起來很復雜,但事實並非如此。 對於b
這正是您正在執行的操作。 context
是“封閉的”到的執行范圍b
,因為變量可以用的呼叫者的范圍b
(因為它是一個參數傳遞給a
)。
不,這是不可能的,並且會導致非常難看/難以閱讀的意大利面條代碼。
為什么不能將其作為函數的參數傳遞? 另一個(但也很丑陋)的解決方案是在兩個函數都可以訪問它的范圍內聲明變量(即在父函數或全局函數中)
在您的示例中,“上下文”是作用域為c()和a()的變量(兩個不同作用域中的兩個不同變量,具有相同的名稱)。
從您如何命名變量“ context”來看,我認為.call是您想要的?
值得一提的是,一旦您想到了塊范圍,javaScript中的范圍實際上非常簡單。 function { ... }
之間出現的任何內容都是作用域。
在您的情況下,如果在c中將上下文作為參數傳遞,則不會中斷:
// C can access 'context'
var d = function () {
console.log(arguments[0]);
};
var c = function (context) {
d(context);
};
c('oh oh'); // doesn't break
在d中,您將可以使用argv / args來訪問它(不記得確切了),所以類似args [0]或argv [0]
編輯:
帶參數的更改代碼
定義一個位於頂級范圍內的變量:
(function(){
var global;
var d = function () {
console.log(global);
};
var a = function (local) {
global = local;
b = function () {
console.log(global);
};
b();
};
}())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.