JavaScript中的函数声明和函数表达式

JavaScript 中定义函数的方式有两种,一种是函数声明,另一种是函数表达式。这两种定义方式之间有一些细微的差别。

1.函数声明:

function 关键字 + 函数名字 + 函数体构成了函数声明,具体形式如下:

function functionName(arg0, arg1, arg2) {
  // function body
}

Firefox、 Safari、 Chrome 和 Opera 都给函数定义了一个非标准的 name 属性,通过这个属性可以访问到给函数指定的名字:

alert(functionName.name);//"functionName"

关于函数声明的一个重要特征就是函数声明提升(function declaration hoisting,意为在执行代码前会先读取函数声明,也就是说可以在函数声明前调用函数:

sayHello();//"Hello"
function sayHello() {
  alert("Hello~");
}

2.函数表达式:

函数表达式有点类似常规的变量赋值语句,这种情况下创建的函数叫做匿名函数(anonymous function),具体形式如下:

var functionName = function(arg0, arg1, arg2) {
  // function body
};

函数表达式与函数声明主要有两点不同,一是由于函数表达式定义的为匿名函数,因此该变量的 name 属性是空字符串:

alert(functionName.name);//""

二是函数表达式没有函数声明提升这一特性,因此不能再函数表达式前调用函数:

sayHello();//error
var sayHello = function() {
  alert("ello~");
};

看一个例子,帮助我们更好地理解一下函数声明函数表达式:

代码片段一:

if (condition) {
  function sayHello() {
    alert("Hello version_1");
  }
} else {
  function sayHello() {
    alert("Hello version_2");
  }
}

表面上看,以上代码表示在 condition 为 true 时,使用一个 sayHello() 的定义,否则就使用另一个定义。但是这种方式很危险,可能会有意想不到的结果,但是,如果使用函数表达式,就没有什么问题了,如下代码片段:

代码片段二:

var sayHello;
if (condition) {
  sayHello = function() {
    alert("Hello version_1");
  };
} else {
  sayHello = function() {
    alert("Hello version_2");
  };
}
时间: 2024-10-18 16:06:21

JavaScript中的函数声明和函数表达式的相关文章

javascript中函数声明与函数表达式的区别

javascript中声明函数的方法有两种:函数声明式和函数表达式.究竟他们用起来有什么区别呢? 区别如下: (1).以函数声明的方法定义的函数,函数名是必须的,而函数表达式的函数名是可选的. (2).以函数声明的方法定义的函数,函数可以在函数声明之前调用,而函数表达式的函数只能在声明之后调用. (3).以函数声明的方法定义的函数并不是真正的声明,他们仅仅可以出现在全局中或者嵌套在其它函数中. 下面来看具体的例子吧.下面这两种方式有什么区别吗? function boo(){}; var bar

【JavaScript】Javascript中的函数声明和函数表达式

Javascript有很多有趣的用法,在Google Code Search里能找到不少,举一个例子: <script> ~function() { alert("hello, world."); }(); </script> 试一下就知道这段代码的意思就是声明一个函数,然后立刻执行,因为Javascript中的变量作用域是基于函数的,所以这样可以避免变量污染,但这里的位运算符『~』乍一看让人摸不到头脑,如果去掉它再运行则会报错:SyntaxError. 在阐述

javascript中函数声明和函数表达式浅析

记得在面试腾讯实习生的时候,面试官问了我这样一道问题. //下述两种声明方式有什么不同 function foo(){}; var bar = function foo(){}; 当初只知道两种声明方式一个是函数声明一个是函数表达式,具体有什么不同没能说得很好.最近正好看到这方面的书籍,就想好好总结一番. 在ECMAScript中,有两个最常用的创建函数对象的方法,即使用函数表达式或者使用函数声明.对此,ECMAScript规范明确了一点,即是,即函数声明 必须始终带有一个标识符(Identif

Javascript函数声明与函数表达式的区别

在定义函数时,我们一般使用下面这两种方法: 使用函数声明定义: 1 2 3 function  sum (a, b) {     return a + b; } 使用函数表达式定义: 1 2 3 var sum = function (a, b) {     return a + b; } 调用方法都是一样的: 如求"1+1"等于几: 1 alert(sum(1, 1)); 但这两种方法还是有区别的.解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁.解析器会率先读取函

JavaScript笔记- 函数声明和函数表达式(001)

function 是 Javascript 中的第一类对象,这就意味着函数可以像其他值一样被传递.一个最常见的用法就是将一个匿名函数作为回调函数传递到另外一个异步函数中. 函数声明 ? 1 function foo() {} 函数 foo 将会在整个程序执行前被 hoist (提升),因此它在定义 foo 函数的整个 scope (作用域)中都是可用的.即使在函数定义之前调用它也没问题. 1 2 foo(); // Works because foo was created before thi

JavaScript函数声明与函数表达式

定义函数的方式有两种:一种是函数声明,另一种是函数表达式. 一.两者的语法 函数声明的语法: function functionName(arg0, arg1, arg2){ //函数体 } 函数表达式的语法: var functionName = function(arg0, arg1, arg2){ //函数体 } 因为function关键字后面没有标识符,这种情况下创建的函数叫做匿名函数(anonymous function,有时也叫拉姆达函数).匿名函数的name属性是空字符串. 二.两

JavaScript 函数声明与函数表达式的区别 函数声明提升(function declaration hoisting)

解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁.解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问).至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真的被解释执行.例子: alert (sum(10,10)); function sum (num1, num2) { return num1 + num2; } 以上代码完全可以正常运行.因为在代码开始执行之前,解析器就已经通过一一个名为函数声明提升(function declaration hoist

JS中函数声明与函数表达式的不同

Js中的函数声明是指下面的形式: function functionName(){ } 这样的方式来声明一个函数,而函数表达式则是类似表达式那样来声明一个函数,如: var functionName = function(){ } 可能很多朋友在看到这两一种写法时会产生疑惑,这两种写法差不多,在应用中貌似也都是可行的,那他们有什么差别呢? 事实上,js的解析器对函数声明与函数表达式并不是一视同仁地对待的.对于函数声明,js解析器会优先读取,确保在所有代码执行之前声明已经被解析,而函数表达式,如同

javaScript的函数(Function)对象的声明(@包括函数声明和函数表达式)

平时再用js写函数的时候,一般都是以惯例 function fn () {} 的方式来声明一个函数,在阅读一些优秀插件的时候又不免见到 var fn = function () {} 这种函数的创建,究竟他们用起来有什么区别呢,今天就本着打破砂锅问到底的精神,好好来说说这个让人神魂颠倒的--函数声明.  函数声明 函数声明示例代码 function fn () { console.log('fn 函数执行..'); // code.. } 这样我们就声明了一个名称为fn的函数,这里出个思考,你认

javascript函数声明和函数表达式的区别

定义一个函数,可以有好几种方法,其中最常用的就是函数声明和函数表达式,虽然都可以实现定义函数,但他们之间是有区别的. 1.例如: 1.1 函数声明 function log () { console.log.apply(console, arguments); } log 是函数名,指向它声明的函数对象. 1.2 函数表达式 var log = function () { console.log.apply(console, arguments); }; log 也指向它声明的函数对象, 不过是