来自函数链的javascript变量赋值

时间:2015-08-13 03:09:31

标签: javascript

试着把这个愚蠢一点:

    //first named function
    function tryMe(x){
        tryMeAgain(x);
    };

    //second named function
    function tryMeAgain(y){
        return y;
    };

    //assign the result of first function (which will actually be the result of the second function) to a var
    var testTry = tryMe('worth a shot');

    console.log(testTry); //undefined! But I would like 'testTry' to return 'worth a shot'

所以我有两个问题:

  1. 这是为什么?
  2. 如何分配' testTry'正常吗?
  3.   

    以下编辑:   因此响应都是有意义的,我认为我的问题可能存在于我的代码中的其他地方。我试图简化这个问题可能忽略了另一个难题。我包括一个新版本,并希望你们都能解释一下:

      var runtime = (function(){
    
            var $jq = jQuery.noConflict(true);
    
            function Runtime(){
                this.$jq = $jq;
            }
    
            Runtime.prototype.method1 = function( _value, _callback ){
                setTimeout(function(){ console.log('dependency1_resolved');
                    _callback.apply(this, [{valIs:_value}]);
                }.bind(this), (Math.random() * 1000));
            };
    
            Runtime.prototype.method2 = function( _value, _callback ){
                var self = this;
                setTimeout(function(){ console.log('dependency2_resolved');
                    _callback.apply(self, [{differntValIs:3}]);
                }.bind(this), (Math.random() * 1000));
            };
    
            Runtime.prototype.method3 = function( _value, _callback ){
                setTimeout(function(){ console.log('dependency3_resolved');
                    _callback.apply(this, [{valIs:_value['differntValIs'] *= 4}]);
                }.bind(this), (Math.random() * 1000));
            };
    
            return new Runtime();
        })();
    
    
      runtime.initialize(function( $ ){
        function firstCalc(firstInput){
            return runtime.method1(firstInput,secondCalc);
        };
        function secondCalc(secondInput){
            return runtime.method2(secondInput, thirdCalc);
        };
        function thirdCalc(thirdInput){
            return runtime.method3(thirdInput, fourthCalc);
        };
        function fourthCalc(ourResult){
            //console.log( ourResult );
            return ourResult;
        };
    
        var _value = firstCalc(4); //this is undefined!!
    });
    

4 个答案:

答案 0 :(得分:1)

您要从tryMeAgain返回值,而不是从tryMe方法返回值,因此返回的默认值为undefined



//first named function
function tryMe(x) {
  return tryMeAgain(x);//need to return the value returned by tryMeAgain to the caller of tryMe
};

//second named function
function tryMeAgain(y) {
  return y;
};

//assign the result of first function to a var
var testTry = tryMe('worth a shot');

snippet.log(testTry);

<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

除非另有说明,否则函数的默认返回值为undefined。这就是您的代码中发生的事情,testTry返回undefined

答案 2 :(得分:0)

你的整个代码都是错误的。

  function tryMe(x){
             tryMeAgain(x);
         };

在这里你只是调用函数但没有返回那个正在调用它的值,那么肯定是

 var testTry = tryMe('worth a shot');

未定义

将其更改为

function tryMe(x){
     return  tryMeAgain(x);
 };

修改

 function firstCalc(firstInput){
        return runtime.method1(firstInput,secondCalc);
    };

你的firstCalc正在调用secondCalc和secondCalc调用thirdCalc,但你缺少的是 firstCalc secondCalc thirdCalc 是函数和你的将这些值作为没有任何值的变量传递,将它们称为函数。

function firstCalc(firstInput){
        var secondCalc = secondCalc(thiValueYouWantToCalculate);
            return runtime.method1(firstInput,secondCalc);
        };

答案 3 :(得分:0)

让我们按照函数调用开始:

var _value = firstCalc(4);

firstCalc(4)的结果是什么?好吧,firstCalc()返回runtime.method1()的结果。

runtime.method1(4,secondCalc)的结果是什么?它是未定义的,因为runtime.method1()只是稍后执行setTimeout来调用secondCalc(),然后返回。没有显式的return语句,因此默认行为是返回undefined。

这就是你的初始表达式“var _value = firstCalc(4)”结束的地方。

setTimeouts导致在随机延迟之后调用其他函数,并且实际上在fourthCalc()内部变量ourResult应该是{valIs:12},但是这会在setTimeouts导致各种calc函数之后发生调用。另外,在第四次Calc中的“return ourResult”将我们的结果归还给......谁?没有人;没有任何东西可以将fourthCalc的结果分配给任何东西。

试试这个:

{{1}}