javascript三元表达式 函数宣言和函数表达式的区别

西西软件下载最安全的下载网站、值得信赖的软件下载站!
→ javascript中函数语句和表达式定义函数的区别
类型:音频处理大小:1M语言:中文 评分:5.3
JavaScript 语句JavaScript 语句向浏览器发出的命令。语句的作用是告诉浏览器该做什么。下面的 JavaScript 语句向 id=&demo& 的 HTML 元素输出文本 &Hello World&:document.getElementById(&demo&).innerHTML=&Hello World&;分号;分号用于分隔 JavaScript 语句。通常我们在每条可执行的语句结尾添加分号。使用分号的另一用处是在一行中编写多条语句。提示:您也可能看到不带有分号的案例。在 JavaScript 中,用分号来结束语句是可选的。JavaScript 代码JavaScript 代码(或者只有 JavaScript)是 JavaScript 语句的序列。浏览器会按照编写顺序来执行每条语句。本例将操作两个 HTML 元素:实例document.getElementById(&demo&).innerHTML=&Hello World&;document.getElementById(&myDIV&).innerHTML=&How are you?&;JavaScript 代码块JavaScript 语句通过代码块的形式进行组合。块由左花括号开始,由右花括号结束。块的作用是使语句序列一起执行。JavaScript 函数是将语句组合在块中的典型例子。下面的例子将运行可操作两个 HTML 元素的函数:实例function myFunction(){document.getElementById(&demo&).innerHTML=&Hello World&;document.getElementById(&myDIV&).innerHTML=&How are you?&;}您将在稍后的章节学到更多有关函数的知识。JavaScript 对大小写敏感。JavaScript 对大小写是敏感的。当编写 JavaScript 语句时,请留意是否关闭大小写切换键。函数 getElementById 与 getElementbyID 是不同的。同样,变量 myVariable 与 MyVariable 也是不同的。空格JavaScript 会忽略多余的空格。您可以向脚本添加空格,来提高其可读性。下面的两行代码是等效的:var name=&Hello&;var name = &Hello&;对代码行进行折行您可以在文本字符串中使用反斜杠对代码行进行换行。下面的例子会正确地显示:document.write(&Hello \World!&);不过,您不能像这样折行:document.write \(&Hello World!&);使用javascript多年,写过无数函数,今天却才真正弄明白两种函数定义的区别,真是悲剧,写下这个随笔, 以时刻提醒自己要打好基础 , 一大把年纪了, 不能继续懵懵懂懂了。通常我们会看到以下两种定义函数的方式:&// 函数语句
function fn(str)
console.log(str);
// 表达式定义
var fnx=function(str)
console.log(str+ ' from fnx');
};以前都是凭借自己手指的感觉随心所欲使用两者 -_- || ,今天看了js基础, 总算是解决了心中对他们的困惑:两种方式都创建了新的函数对象, 但函数声明语句的函数名是一个变量名, 变量指向函数对象, 和通过var声明变量一样,函数定义语句中的函数被显示地提前到了脚本或函数的顶部, 因此它们在整个脚本和函数内都是可见的,但是使用var 表达式定义函数, 只有变量声明提前了,变量初始化代码仍然在原来的位置, 用函数语句创建的函数, 函数名称和函数体均被提前,所以我们可以在声明它之前就使用它。&代码例子如下:
console.log(typeof(fn)); // function
fn('abc'); // abc
console.log(typeof(fnx)); // undefined
fnx('abc');
// will not execute
console.log('fnx is undefined'); // fnx is undefined
// 函数语句
function fn(str)
console.log(str);
// 表达式定义
var fnx=function(str)
console.log(str+ ' from fnx');
};代码很简单, 希望和我之前一样没有弄明白两者区别的同学能有所收获。&
01-2301-2201-2201-2201-2201-2201-2201-2201-1701-13
阅读本文后您有什么感想? 已有23人给出评价!
名称大小下载Javascript浅谈之表达式和语句的区别-javascript-电脑编程网Javascript浅谈之表达式和语句的区别作者:%e5%a1%9e%e8%8f%b2%e7%bd%97%e6%96%af 和相关&&简介
  表达式(expressions)和语句(statements)在script非常常见,但是就是这些常见的元素,有时候我们也未必能够正确的领会其要表示的含义和用法。这是因为我们总是对常见的东西本能的表示默认,好像它天生就该如此,为很少去考虑其背后所代表的含义。比如:if的条件中为什么能有赋值,立即执行函数为什么要用小括号给括起来调用等。
  在区分表达式和语句之前,我们先分别对他们进行介绍:
  1.表达式(expressions)
    表达式是由运算符构成,并运算产生结果的语法结构。每个表达式都会产生一个值,它可以放在任何需要一个值的地方,比如,作为一个函数调用的参数.下面的每行代码都是一个表达式:
var a = (5 + 6) / 2; //表达式:(5 + 6) / 2
var b = (function(){ return 25;})(); //表达式: (function(){ return 25;})()
foo(a*b); //表达式:a*b
  2.语句(statements)
    语句则是由&;(分号)&分隔的句子或命令。如果在表达式后面加上一个&;&分隔符,这就被称为&表达式语句&。它表明&只有表达式,而没有其他语法元素的语句&。
var a = (5 + 6) / 2; //整行,赋值语句
if(a&12) { statements} //条件语句
var o = {}; //赋值语句
(function(obj){ obj.b = 23;})(o||{}); //表达式语句
  一般的script中的语句分为下面几种:
  (1)声明语句:变量声明和函数声明
  (2)赋值语句
  (3)控制语句:能够对语句执行顺序产生改变,包括条件语句和循环语句,当然还有比较特殊的标签语句。
  (4)表达式语句:这些语句去掉最后分号,都也可当表达式用的。常见的有:对象操作(new、delete)、函数调用(函数执行,必有返回值)等。
var num = 9; //声明、赋值语句
vloop: //标签语句
//其实这里大括号可以不需要的,在这里我只想向大家展示一下这种代码块结构而已
for(var i=1; i&10; i++) { //循环语句
if(i==num){ //条件语句
num = num - 1;
console.log(num); //表达式语句,输出:5 
  由上面可以看出,表达式和语句还是存在很大区别的,可也说表达式是语句的构成部分,而语句则又可以组成可执行代码块。一般而已,我们都可以很直观的看出两者的区别,但是,一些特殊情况就不太好区别。
难以区分的表达式和语句
 1.对象字面量和代码块
b : "string"
& & & 上面是一个简单至极的对象字面量,但是我们单单从代码的直观层面来看,这个字面量其实跟代码块非常相似,由两个标签语句组成的感觉。复杂些上,还有上面之前我在语句最后举得那个例子,例子中代码块位于标签语句下面,里面包含有个for循环。这时候,你说这个由{}构建的代码块是表达式呢还是语句?
  2.命名函数表达式
  javascript中有三种函数类型:函数声明,函数表达式和函数构造器创建的函数。
  (1)函数声明(FD)
  function foo(){ }
  (2)函数表达式(FE)
  var foo = function(){}
  还有一种比较特殊点的:var foo = function _foo() {} ,这是时候,给函数一个供内部使用的名字_foo,所有,此时,这种类型又称:命名函数表达式(NFE)。
  (3)函数构造器创建
  var foo = new Function(expressions);
  其实上面说了函数的三种类型并不是我们这章的主要重点,这这我们也是探讨一下FD和NFE的一些区别而已,关于其他函数内容后面我单独在细说。
  是不是看到FD和NFE的形式之后,又有点点迷糊了,NFE除了前面多了一个var和变量名之外,其他和FD的结构一模一样,这样的话,那是不是说明FD既可以作声明语句,也同时可以作赋值表达式呢?
  解答之前两个疑惑
  鉴于上面两个比较让人迷惑的语法点,javascript它自己也认识到不足,之后果断改进,做出了如下声明:JavaScript语法禁止表达式语句以大括号或关键字"function"开头。
知错能改善莫大焉,当知道javascript做出如此强制的规约时,就一下子对前面两个疑惑有了答案。
  在这之前,我们还要想提下三个概念:语句上下文、表达式上下文和表达式语句。
  语句上下文:在这个环境中,这这句代码(表达式或者语句)应该理解成一个语句。
  表达式上下文:在这个环境中,这句代码(表达式或者语句)应该理解成一个表达式。
  表达式语句:这个表达式既可以看作是一个表达式(因为它能产生一个值),又可以看作是一个执行语句(因为它能执行某些功能,比如执行一个函数等)。表达式语句可以是javascript链式编程的基础。
  上面这个概念起辅助理解作用,不用做过深追究。
  我们再来看之前的那两个疑惑:
  第一个,vloop的冒号后面由大括号中那一段代码,里面都有循环和赋值等操作,那说明它都不是一个表达式语句,所以它不必遵循上面的规定。在这其实它只是一个代码块语句而已。不过对于对象字面量而言,它确实一个货真价实的表达式语句,根据规约,它就只能乖乖的做表达式,不能做语句。
  第二个,对于NFE类型函数来说,你可以将它看作是一个函数申明语句,同时也可以将之看成一个表达式,但是根据javascript的规定,表达式语句不能以function开头,所有在这,NFE中的肯定是表达式了。当然,对于FD,这个很明显,是函数声明语句,不用怀疑。
  其实,还有另一种判定方法,根据上下文判断,利用之前我们说过语句上下文和函数上下文。对于一个表达式语句,当你无法区分它是表达式还是语句,你参照上下文,判断程序在这需要做什么,是变量赋值?还是语句执行?看到前面由&=&(赋值)或者用&()&(小括号,在这时分组符,里面只能包含表达式),你就可以肯定,这是一个表达式上下文。javascript的解释器就是这个干的。
var foo = function _foo(index){
console.log("传入的参数是:"+index||"空值")
//输出:传入的参数是:1
console.log(foo);
//输出:undefined
//根据上下文判断,"var foo = "后面是表达式上下文,所有解释器自动将后面看成一个立即执行函数,虽然没有小括号。
function foo(index){
console.log("传入的参数是:"+index||"空值")
console.log(foo); //function foo(index){...}
//解释器判断此为语句上下文,所以讲语句拆分为两段。前一段为函数声明,后一段&(1)&为一个简单的分组语句。
  看到上面,你是不是灵机一动,发现你居然可以强制将表达式语句转换成表达式了!
  转换方法:
  (1)利用小括号,也就是分组符号(分组符内只允许表达式),进行转换。
o = eval("{obj:'this is a object'}")
console.log(o); //this is a object
o = eval("({obj:'this is a object'})")
console.log(o); //Object {obj: "this is a object"}
前者eval中没有加小括号,运行时被认为是一条语句执行,所以o被赋值成义字符串了;而后者,被认为是加上小括号,被认为是在表达式上下文中执行,所有返回一个对象。
  (2)利用运算符,因为javascript引擎会认为这是参与运算的必须是表达式。
+function(index){
console.log("传入的参数是:"+index||"空值");
//输出:传入的参数是:1
//表达式结果是:1
  记得上面我也运行过这个句代码,不过当时前面少了个加号(&+&)。比较一下两者的结果。
  通过以上分析,不知道大家对表达式和语句是不是有点豁然开朗的感觉,反正我觉得我是通过写blog加深了对javascript的理解。我总是渴望把我所领会到的知识尽我之力,分享出来,可能会有不对,但是自己感觉到的是收获与成长,希望大家看过之后有问题可以交流一下。我会继续努力。
&相关资料:||||Javascript浅谈之表达式和语句的区别来源网络,如有侵权请告知,即处理!编程Tags:                &                    javascript 函数宣言与函数表达式的区别 - JavaScript当前位置:& &&&javascript 函数宣言与函数表达式的区别javascript 函数宣言与函数表达式的区别&&网友分享于:&&浏览:5次javascript 函数声明与函数表达式的区别还是一样,先上代码:
var f = function g() {
if (false) {
f = function g(){
alert(g()); // 2
把这段代码扔到IE 6 里面和chorme里面是完全不同的两种效果。
这里输出2 是在ie6里面的效果,如果在chorme会出现g没有定义。
这也算是JScript的bug吧。
在这里很明显,这里的只是定义了g的函数表达式而已。包括在if的条件语句中,也只是定义了函数表达式,没有去声明函数。
那么这样直接访问肯定是会出错的。
那么对于何为声明,何为函数表达式呢?
在ECMAScript中,创建函数的最常用的两个方法是函数表达式和函数声明,两者期间的区别是有点晕,因为ECMA规范只明确了一点:函数声明必须带有标示符(Identifier)(就是大家常说的函数名称),而函数表达式则可以省略这个标示符:
& & & & 函数声明:
  function 函数名称 (参数:可选){ 函数体 }
  函数表达式:
  function 函数名称(可选)(参数:可选){ 函数体 }
所以,可以看出,如果不声明函数名称,它肯定是表达式,可如果声明了函数名称的话,如何判断是函数声明还是函数表达式呢?ECMAScript是通过上下文来区分的,如果function foo(){}是作为赋值表达式的一部分的话,那它就是一个函数表达式,如果function foo(){}被包含在一个函数体内,或者位于程序的最顶部的话,那它就是一个函数声明。
还有一种函数表达式不太常见,就是被括号括住的(function foo(){}),他是表达式的原因是因为括号 ()是一个分组操作符,它的内部只能包含表达式。
你可能会想到,在使用eval对JSON进行执行的时候,JSON字符串通常被包含在一个圆括号里:eval('(' + json + ')'),这样做的原因就是因为分组操作符,也就是这对括号,会让解析器强制将JSON的花括号解析成表达式而不是代码块。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有【转】javascript函数声明和函数表达式的区别
21:31 by 活着就是受罪, 211
阅读,&2&评论,&,&
定义一个函数,可以由好几种方法,其中最常用的就是函数声明和函数表达式,虽然都可以实现定义函数,但他们之间也会有区别。
下面咱们先看函数声明如何定义函数:
一个简单的例子:
function count(a,b){
return a+b;
在这里,count作为函数名,其实就是一个指向了函数对象的指针。
如果用函数表达式来定义同样的函数:===&也就是,有“=”赋值的,就是函数表达式
var count = function(a,b){ return a+b;};
这里的count做为变量,也同样指向了函数对象。
因此在后续的调用中,效果是没有差别的;但是他们的区别在于解析器对这两种定义读取的顺序不同;
解析器会事先读取函数声明,并在执行后续的代码之前使之可以使用,即使你把函数声明放在代码的末端;
而对于函数表达式,解析器只有在读到函数表达式所在那行的时候才执行;
可以看下面代码的比较:
函数声明(顺利执行):
alert(count(10,10));
function count(a,b)
return a+b;
函数表达式(报错):
alert(count(10,10))
var count = function(a,b){
return a+b;
从这里就能看出两者的区别了。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。javascript中函数声明和函数表达式的区别_百度知道

我要回帖

更多关于 函数表达式 的文章

 

随机推荐