簡體   English   中英

將變量傳遞到函數上下文

[英]Passing variables to function context

我想知道是否有一種方法可以執行以下操作:

function testFunction(a, b) {
   console.log(a + b, c);
}
testFunction(2,3); // Should print "5, undefined"
testFunction.localContext.c = "foo";
testFunction(2,3); // Should print "5, foo"

實際上,我希望能夠設置函數上下文的變量。

謝謝 !

詳細信息,其實我有這個:

   function requestHandler(req, res) {
       function validateMsg(str) {
            // Do stuff with req.user and str and so on
       }
       var msg = req.body.message;
       if (validateMsg(msg)) {
           send(msg);
       }
   }

我的問題是我想將函數“ validateMsg”移到頂部,因此可以在其他請求處理程序中使用它。 但是,如果這樣做,我將失去其localScope。 這就是為什么我想更改它。

我的問題是我想將函數“ validateMsg”移到頂部,因此可以在其他請求處理程序中使用它。 但是,如果這樣做,我將失去其localScope。 這就是為什么我想更改它。

好吧,JavaScript具有詞法范圍,而不是動態范圍。 您無法更改功能的環境。

我不明白為什么不能將reqreq.user作為函數的參數傳遞。 如果該函數僅在有權訪問請求對象或用戶的情況下才起作用,則應將其作為函數參數的一部分:

function validateMsg(str, user) {
     // Do stuff with user and str and so on
}

function requestHandler(req, res) {
   var msg = req.body.message;
   if (validateMsg(msg, req.user)) {
       send(msg);
   }
}

否,但是對象旨在解決該問題。 如果需要一些功能來處理數據,則可以使用對象,而JavaScript函數本身就是對象!

function testFunction(a, b) {
    console.log(a + b, testFunction.c);
}

testFunction(2,3); // Prints "5, undefined"
testFunction.c = "foo";
testFunction(2,3); // Prints "5, foo"

編輯:使其獨立於函數的名稱:

function setCAndCall(f, c) {
    f.c = c;
    f(2,3);
}

setCAndCall(testFunction, "foo"); // prints "5, foo"
// and you can do that with any function, not just testFunction

然而定義f將有指本身,只是在以同樣的方式testFunctiontestFunction.c在它的身上。 如您在其他答案中所指出的,如果您希望一切都獨立於函數nae,那么最好的選擇是使用適當的對象和this關鍵字。

另一種方法是定義一個封裝第三個元素的對象:

 var test = { c: undefined, fn: function(a, b) { console.log(a+b, this.c); } } test.fn(2,3); // prints '5, undefined' test.c = 99; test.fn(2,3); // prints '5, 99' 

我了解這並非您真正要求的,但是您認為可以從中得到一些收益。 arguments是函數上下文中存在的數組變量,它將保存所有傳遞的參數,您甚至不必聲明變量。

function testFunction() {
  var c = [];
  for(var i in arguments){
    c.push(arguments[i]); // you can do anything with the number of variables or iterations
  }
  console.log(c.join(','));
}
testFunction(2,3); // Should print "2,3"
testFunction(2,3,'foo'); // Should print "2,3, foo"
testFunction('1', 2, 3,'foo', 88); // Should print "1, 2, 3, foo, 88"

編輯2:問題陳述

將fn validateMsg()移出fn requestHandler()范圍

function validateMsg() {
    var str = arguments[0];
    var req = arguments[1];
    var res = arguments[2];
    // Do stuff with req.user and str and so on
}
function requestHandler(req, res) {
   var msg = req.body.message;
   if (validateMsg(msg,req,res)) {
       send(msg);
   }
}

我想您可以隨意傳遞參數,也可以選擇不傳遞參數,不要忘了在reqres添加空檢查 ,即arguments[1]arguments[2]

如果要對不同的請求處理程序重用validateMsg(..)函數,則可以使用處理程序上下文本身調用此方法,並通過this關鍵字進行訪問:

 function validateMsg(str) { return str == this.req.user; } function requestHandler1(req, res) { var msg = req.message; if (validateMsg.call(this, msg)) { alert(msg); } } function requestHandler2(req, res) { var msg = "dude"; if (validateMsg.call(this, msg)) { alert(msg); } } var req = { message: "abc", user: "abc" } var res = {} requestHandler1(req, res); requestHandler2(req, res); 

有關Function.prototype.call(..)詳細信息,請參見官方文檔 Function.prototype.call(..)

我認為這不是解決您問題的方法,但是您詢問了有關在函數上下文中設置變量的問題。

要在函數范圍內設置變量,您不能將其分配給外部可見的屬性-這不是一回事。 您需要創建一個閉包(通過創建一個返回testFunction的函數),或者執行類似以下的操作,但是請注意,參數的順序很重要,因此您無法完全按照自己的要求進行操作,但是需要非常緊密的操作:

var testFunction = function(a,b,c){
  console.log(a+b, c);
 };

testFunction(2,3) // "5, undefined"

testFunction = testFunctio.bind(testFunction, 1);// now a=1 in testFunction    
testFunction(2,3); // "3, 3" , because a=1, and b,c=2,3      

// or if you don't want to alter testFunction
testFunction.bind(testFunction, 1)(2,3); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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