簡體   English   中英

如何訪問函數調用者上下文?

[英]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)就像將ca一樣,將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM