【问题标题】:Javascript calling function expressionJavascript调用函数表达式
【发布时间】:2017-04-07 16:18:53
【问题描述】:

这样调用函数是有意义的:

print(square(5));  
function square(n){return n*n}

但是为什么下面的调用不起作用?

print(square(5));  
square = function (n) {  
  return n * n;  
}  

如果我们坚持使用“square = function(n)”的格式,有什么解决办法?

【问题讨论】:

  • 如果您考虑以下代码中会发生什么:foo = function () { alert('bar') }; foo(); foo = function () { alert('baz'}; 推理应该很明显。

标签: javascript


【解决方案1】:

“普通”函数声明被提升到作用域的顶部,因此它们始终可用。

变量声明也被提升,但赋值直到该特定代码行被执行后才会发生。

因此,如果您执行var foo = function() { ... },您将在范围内创建变量foo,它最初是undefined,然后才为该变量分配匿名函数引用。

如果“稍后”是在您尝试使用它之后,解释器不会抱怨未知变量(毕竟它确实已经存在),但它会抱怨您试图调用 undefined 函数引用.

【讨论】:

  • 不,即使我按照您建议的方式进行了尝试,它也不起作用。输出是“未定义的”。请看以下链接:developer.mozilla.org/en/JavaScript/Guide/…
  • 你是对的。它抱怨打印功能。我也意识到为什么值函数不能作为函数表达式工作的原因是函数表达式在所有其他代码之前被首先读取;而值函数被读取为正常流程。
  • @user1386284 确切地说——“先阅读”就是通常所说的“提升”
【解决方案2】:

    var s=function ()
	{
		console.log("hi there");
        document.write("function express called");
		alert("function express called");

		
	}

	s();
 

【讨论】:

    【解决方案3】:

    您需要更改顺序,在声明和分配变量之前使用它:

    square = function (n) {//Better use "var" here to avoid polluting the outer scope
      return n * n;  
    }  
    print(square(5));  
    

    var 的正确方法:

    var square = function (n) { // The variable is now internal to the function scope
      return n * n;  
    }  
    print(square(5));  
    

    【讨论】:

    • @Alnitak。为什么你认为代码 sn-p 在全局对象中?不能在内部范围内吗!?
    • 当然,它可以是,但我认为根据您在第二个代码示例中的评论,假设 OP 将此代码放入另一个函数中是不安全的。跨度>
    • @Alnitak。还是真的,它是函数作用域的内部!,而全局对象中的作用域就是……全局对象。
    • 不,即使我按照您建议的方式进行了尝试,它也不起作用。输出是“未定义的”。请看以下链接:developer.mozilla.org/en/JavaScript/Guide/…
    • 你是对的。它抱怨打印功能。我也意识到为什么值函数不能作为函数表达式工作的原因是函数表达式在所有其他代码之前被首先读取;而值函数被读取为正常流程。
    【解决方案4】:

    在函数表达式中,您会像使用任何其他值一样使用函数,您是否期望:

    print(a);
    var a = 5
    

    上班? (我不是真的在问)

    【讨论】:

      【解决方案5】:

      在第二种情况下,square 是受(重新)赋值的常规变量。考虑:

      square = function (n) {  
        return "sponge";  
      }  
      print(square(5));  
      square = function (n) {  
        return n * n;  
      }  
      

      您希望这里的输出是什么?

      【讨论】:

        【解决方案6】:

        var s=function ()
        	{
        
        		console.log("s");
        		alert("function expression with anomious function");
        
        		
        	}
        
        s();
        
        var otherMethod=function ()
        	{
        
        		console.log("s");
        		alert("function expression with function name");
        
        		
        	}
        
        otherMethod();
        
        	

        【讨论】:

        • 请添加更多信息和/或对您的答案的描述,以便其他人容易理解。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-17
        • 2017-07-08
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 2017-08-30
        相关资源
        最近更新 更多