返回JavaScript函数中的值

时间:2015-03-17 17:34:32

标签: javascript

我正在审查函数与全局范围中的变量可访问性,并遇到了一些新内容,并想知道以下内容是否正确:

function foo (){
    message='Hi'
}
alert(message); //ReferenceError: message is not defined

这会返回一个错误,因为foo尚未在任何地方调用,但是一旦执行,它就可以在全局空间中使用。明白了。

然而,除了显式地使函数返回一个值(即使用return关键字)之外,我在某处读到了它们,我们将它们用于它们的副作用(例如,想象一下我将该警报函数放在我刚引用的foo中)。

以上是否以某种方式返回值与使用return关键字时的方式相同?

更新 我收到了很多反馈,但也许我应该重申一下这个问题。 仅仅是调用函数将其置于全局范围内的事实。 就像幕后发生的一样......?我认为有些人可能会认为(就像我一样)只是省略var,它就在全球范围内。实际上,对于那些不知道的人,你必须先调用该函数。 谢谢!

4 个答案:

答案 0 :(得分:5)

  

以上是以某种方式返回值的方式与使用return关键字时的方式相同吗?

没有。通过分配给未在任何地方声明的变量,它依赖于Horror of Implicit Globals。当您这样做时,在松散模式下,它会创建一个全局变量。它与从函数返回值无关,而且你应该做的事情没什么 - 事实上,这是使用严格模式和/或像JSHint这样的“lint”工具的更好理由之一,因此无意中的全局变为你可以找到并修复的错误。

要从函数返回值,您:

  1. 在函数中使用return来说明返回的内容以及何时返回,例如:

    function myFunction() {
        return "foo";
    }
    
  2. 调用时使用函数的结果,例如:

    var variable = myFunction();
    // or
    anotherFunction(myFunction());
    // etc.
    
  3. 在松散模式和严格模式下分配未声明变量的差异示例:

    function runLoose() {
      // In loose mode
      try {
        looseFoo = "bar";
        snippet.log(looseFoo); // "bar"
      }
      catch (e) {
        snippet.log("Got exception: " + e.message);
      }
    }
    
    function runStrict() {
      "use strict";
      
      // In strict mode
      try {
        strictFoo = "bar"; // <== Causes ReferenceError
        snippet.log(strictFoo);
      }
      catch (e) {
        snippet.log("Got exception: " + e.message);
      }
    }
    
    runLoose();
    runStrict();
    <!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
    <script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

答案 1 :(得分:1)

不,没有任何回复。

如果先调用foo,则定义消息,因为声明没有var的变量在范围内是全局的。

如果你添加var它不再具有全局范围,你会得到同样的错误。

function foo (){
    var message='Hi'
}
foo();
alert(message); //ReferenceError: message is not defined

答案 2 :(得分:1)

答案是否定的......

您可以通过称为闭包的内容访问父作用域中的变量。

function a () {
  var aValue = 1;
  console.log(aValue); // 1
  function b () {
    aValue += 1;
  }
  console.log(aValue); // 1
  b();
  console.log(aValue); // 2
}

这是有效的,因为当您定义一个函数(源代码实际写入文件的位置)时,该函数会引用其父级范围内的所有变量(及其父级&#) 39;等等,最多window)。

就变量而言,

window本身就是一个特殊情况函数。

将其想象为b。 secretTable .parent。 secretTable .aVar + = 1;

...当你的.parent元素用尽时,你遇到了一个引用错误,你仍然没有在任何地方找到变量名称。

依赖范围表在window上设置未声明的变量(如果将值设置为变量,它会爬上该范围链,直到找到声明var的范围,或者它运行.parent元素...... window,然后将值设置在那里)大概是最糟糕的事情。

......依靠封闭引用,一般来说,以受控方式很棒。

依赖严密的闭包引用(构建thunk / currying函数/等等)对于看起来不像Java的JavaScript来说是关键。

答案 3 :(得分:-1)

它没有返回任何东西。它只是改变了全球&#34;的价值。变量

var test = 0; // global scope
function foo() {
    var localVar = 'bar'; // local to function
    test = 1; // accessing/modifying global "test" var
}
foo();
alert(test);     // alerts "1"
alert(localVar); // ReferenceError: localVar is not defined

要将其分解,第一个变量test是在全局范围内创建的。它在foo()函数内访问并更改。调用所述函数后,该变量上的alert()输出函数中设置的值。 (不需要返回,因为它是全局的)。

另一方面,localVar在函数内创建,因此警告它会产生ReferenceError,这是因为该变量仅存在于函数中。

可以在jsFiddle中复制确切的结果。

http://jsfiddle.net/z1xpvs5j/