2013-12-03 3 views
3

Мои ученики очень новички.Я не знал, что ответить моим ученикам

Когда я учил их JavaScript, я показал им эту функцию заявление:

function test() { 
    /* code */ 
} 

Тогда я показал им, что вы могли бы сделать некоторые ввод непосредственно в консоли Webbrowser. Затем я показываю им арифметические операции: 1+2, 6*3 и так далее.

Один из моих студентов попросили меня попробовать это, и я был уверен, что это не будет работать, но это было:

function test() { 
    1+3; 
} 

Что я мог сказать, чтобы это объяснить? И что я могу сказать, когда вы вводите некоторую привязку в командной строке, например var i=5;, результатом возврата является undefined?

+0

Что такое имя браузера? – Khamidulla

+0

Что вы подразумеваете под "it did [work]"? Что он не выдал исключение или что он вернул «4»? –

+0

независимо от того, что вы делаете, это вернет 13, а не 4 .., чтобы поддержать вас, вопрос plz сделать скрипку. –

ответ

8

В отличие от некоторых других языков JavaScript допускает выражения в качестве операторов, см. §12.4(«Выражение выражений») спецификации. Так что код действителен, он просто не имеет какого-либо длительного эффекта.

Это по той же причине, что это работает:

foo && foo(); 

Это отдельно стоящее выражение так же, как ваш 1+3;. В этом случае, конечно, он вызывает foo, только если foo не является ложным.

Philipp указывает в комментариях, что ECMAScript5's "use strict"; - еще один пример этого. Технически в ECMAscript5 это директива , но она работает с двигателями pre-ECMAScript5, потому что для них это выглядит как выражение.

И что я могу сказать, когда вы вводите некоторую привязку в командной строке, например var i=5;, результат возврата не определен?

Потому что заявления не имеют результата, только выражения. var - statement. Если вы сделали это отдельно, вы получите следующее:

> var i; 
undefined 
> i=5; 
5

... потому что результат выражения присваивания является назначаемым значением.

+0

Как всегда функция просто определена и не называется какой-либо продукцией, как она может работать? – Khamidulla

+6

@antindexer: Я предполагаю, что OP означает, что «это сработало» означает «это не синтаксическая ошибка». –

+0

Если автор вопроса действительно это значит. Он будет работать без проблем, поскольку это действительное выражение. Извините, я не совсем понял вопрос. – Khamidulla

0

Это Expression statement, это совершенно законно в JavaScript

Все выражения имеют возвращаемое значение так:

i = 5 // this is an expression and a statement, returns 5  

, но не все операторы являются выражениями, поэтому они не могут иметь возвращаемые значения.

var i= 5; // this is a statement, NOT an expresion, returns undefined 
0

Вам просто нужно вернуть значение, вычисленное и фактически вызвать функцию, например, так:

function test() { 
    return 1+3; 
} 
test(); 

То, что вы сделали, создать выражение в вашей функции, оцениваемой в 4, но ничего не произошло к нему. Так как вы ничего не вернули в своей функции test(), оно вернет undefined, как и ожидалось. Вы тоже не назовете это, поэтому он вернет результат последнего утверждения. Однако он не просто возвращает созданную вами функцию, потому что вы ее только объявили. Если вы хотите себя объект функции, вам нужно обернуть круглые скобки вокруг него или получить доступ к нему позже, например, так:

function test() { } 
test; 

Или

(function test() { }); 
+1

Вы не получили вопрос, о том, почему код работает вообще, а не почему он не возвращает – Philipp

+2

В защиту Плутона это простой вопрос, который не получается. –

+0

Кажется, я неправильно понял одно слово, которое повлияло на мою интерпретацию вопроса ... – Pluto

1

Когда вы печатаете что-то в консоли браузера вы создавая javascript Program (даже если он равен 3+2, это еще программа). Программа представляет собой последовательность Statement s и FunctionDeclaration s, разделенную (возможно подразумеваемой) точкой с запятой. JS оценивает все утверждения и объявления в порядке, и результат всего Program является последним непустым результатом. В то время как FunctionDeclaration всегда дает пустое значение (undefined), некоторые Statement s могут возвращать непустые результаты. Они перечислены в разделе «Заявления» в стандарте (http://ecma-international.org/ecma-262/5.1/#sec-12), обратите внимание на такие вещи, как

Return (normal, V, empty) or Return (normal, empty, empty) 

, где средняя часть обозначает возвращаемое значение оператора.

Примеры:

> var a=1; function x() { 3+1 } 
undefined 

это ничего не возвращает, потому что нижний var заявление, ни Децл имеют значение.

> 3 + 2 
5 

Это возвращает 5, поскольку выражения выражения имеют значения.

> function x() { 3 + 2 } 
undefined 

Это не определено, потому что FunctionDeclaration s не имеют значения.

> var a = 10; while(a>3) a--; function x() {} 
4 

Это один возвращает 4 потому что while имеет значение.

> var a = 10; if(a>3) a-- 
10 

а также if.

Обратите внимание, что, хотя большинство операторов JS имеют значения, невозможно получить или использовать эти значения в программе JS (кроме eval(), которую консоль делает под капотом). Высказывания оцениваются, но их результаты теряются, и единственной реальной целью заявления является получение побочных эффектов. Это несколько странное поведение является результатом того, что Javascript является функциональным языком (где все имеет значение) с процедурным синтаксисом.Другими словами, семантически не будет никаких проблем, чтобы что-то вроде

return if(a > 10) 5 else 0 

или

x = 5 + do { r = nextVal() } while(!used(r)) 

Единственная причина, почему это не работает произвольное синтаксический ограничение.

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