2015-03-17 7 views
-2

Я просматривал переменной доступности функций против глобального масштаба и наткнулся на что-то новое, и спрашивает, если следующее является правильным:Возвращаемые значения в JavaScript функции

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

Это возвращает ошибку, потому что foo не было где-то еще, но как только вы это сделаете, он доступен в глобальном пространстве. Понял.

Однако я читал где-то, кроме того, что явным образом функции возвращают значение (т. Е. Используя ключевое слово return), мы используем их для своих побочных эффектов (например, представьте, что я поставил эту функцию предупреждения внутри foo, на которую я только что ссылался).

Так вышло, как-то возвращающее значение так же, как при использовании ключевого слова return?

ОБНОВЛЕНИЕ Я получаю много отзывов, но, возможно, я должен повторить вопрос. Является фактом вызова функции, помещающей ее в глобальную область. Как то, что происходит за кулисами ...? Я думаю, что некоторые люди могут думать (как и я), просто опуская var, это в глобальном масштабе. На самом деле, для тех, кто не знает, вы должны сначала вызвать функцию. СПАСИБО!

+0

Трудно понять, что вы имеете в виду. То, что обычно было бы делать, это 'function foo() { return 'Hi'; } alert (foo()); ' – mplungjan

+0

Функция' foo' не возвращает никакого значения, потому что у нее нет ключевого слова 'return'. Это может иметь побочные эффекты, такие как добавление значения в глобальную область, но это отличается от возвращаемого. –

ответ

5

Так вызывается как-то возвращающее значение так же, как при использовании ключевого слова return?

Нет. Он полагается на Horror of Implicit Globals, назначая переменную, которая не объявлена ​​нигде. Когда вы это делаете, в свободном режиме он создает глобальную переменную. Это не связано с возвратом значения из функции, и вам ничего не стоит делать   — на самом деле, это одна из лучших причин использовать строгий режим и/или инструмент «lint», такой как JSHint, чтобы непреднамеренные глобальные переменные стать ошибками, которые вы можете найти и исправить.

Для возврата значения из функции, вам:

  1. Использование return в функции, чтобы сказать, что возвращать и когда, например:

    function myFunction() { 
        return "foo"; 
    } 
    
  2. Используйте результат функции когда вы называете это, например:

    var variable = myFunction(); 
    // or 
    anotherFunction(myFunction()); 
    // etc. 
    

Пример разницы присваивающей к необъявленной переменной в свободном режиме и строгом режиме:

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

Это ничего не возвращает. Это просто изменение значения «глобальной» переменной.

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/

+1

Вы не называете 'foo()' - большинство из приведенных выше неверно. – Archer

+0

@Archer некорректно? Позволю себе не согласиться. «LocalVar» должен был просто продемонстрировать и иметь повод для краткого изложения комментария, объясняющего переменную local-to-function и ее область действия. Недопустимая 'foo()' была честной ошибкой. 3 downvotes? Слабый.Я запустил свой код после добавления отсутствующего 'foo()' (который был только тем, что я был забывчивым и быстрым), и все было как ожидалось и было аннотировано в комментариях к коду. Опять же, «неверно?» Прошу отличить, приятель. В конце концов, мой ответ _is_ правильный и _is_ полезен. Должен ли он быть самым высоким голосом и принятым ответом? Возможно, нет. Но заслуживает ли он 3 голоса? No –

+0

Чувак, это не форум. Если вам что-то не нравится, тогда все в порядке, но давайте не начнем пылать друг друга, да? Теперь, когда вы исправили его, я удалю один и единственный -1, который я вам дал. Вот как работает этот сайт. Точек нет для вас - они там для других людей, поэтому не принимайте это лично. На момент написания мой -1 и комментарий были правильными. – Archer

1

Нет, ничего не возвращается.

Если вы сначала вызываете foo, сообщение определяется, поскольку переменные, объявленные без var, являются глобальными по объему.

Если вы добавите var, он больше не имеет глобальной области действия и вы получите ту же ошибку.

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

Ответ нет ...

У вас есть доступ к переменным, которые находятся в родительских прицелах через что-то известное как закрытие.

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

Это работает, потому что при определении функции (место, где исходный код на самом деле написано в файле), что функция дается ссылка на все переменные в рамках своего родителя (и его родителя, и т. д., до window).

window, сам по себе, является особым случаем в отношении переменных.

Думайте об этом как b. secretTable .parent. secretTable .aVar + = 1;

... вы попадаете в опорную ошибку, когда вам не хватает элементов .parent, чтобы подняться вверх, и вы все равно не нашли это имя переменной в любом месте.

Опираясь на области видимости столов для установки необъявленных переменных на window (если вы установите значение переменной, она поднимается вверх, что цепочка областей видимости, до тех пор, пока не найдет сферу, где была объявлена ​​переменная, или он бежит из .parent элементы ... ... который находится в window, а затем устанавливает там значение) - это самое худшее, когда-либо.

... полагаясь на ссылки на закрытие, в общем, фантастически, контролируемыми способами.

Опираясь на плотные ссылки на замыкание (функции торможения/функции currying/et cetera) является ключевым для JavaScript, который не похож на Java.

Смежные вопросы