资讯专栏INFORMATION COLUMN

深入浅出JavaScript:定义函数(函数声明&函数表达式)

mj / 2524人阅读

摘要:函数声明和函数表达式的区别虽然都可以定义函数,但最大的区别在于解析器会率先读取函数声明,使其在执行任何代码之前就可以访问也就是函数声明提升而函数表达式则需要解析器执行到它所在的代码行才会被解释执行。

定义函数 方法一:函数声明

函数声明要素:function关键字,functionName函数名,arg参数(可选)

语法

function functionName(arg){
    //函数体
}

示例

function square(number) {
  return number * number;
}

var a = 2;

square(a); //4

需要注意的地方:

当函数的参数是一个值(比如上面的例子),
若被调用函数改变了这个参数的值,这样的改变不会影响到全局或调用的函数。

但当函数的参数是一个对象(即一个非原始值,例如Array或用户自定义的其它对象),
若函数改变了这个对象的属性,这样的改变对函数外部是可见的。

function myFunc(theObject) {
  theObject.make = "Toyota";
}

var mycar = {make: "Honda", model: "Accord", year: 1998},
var x, y;

x = mycar.make;     // x 获取的值为 "Honda"【原本】

myFunc(mycar);
y = mycar.make;     // y 获取的值为 "Toyota"【现在】(make属性的值在函数中被改变了)
方法二:函数表达式

函数表达式要素:var关键字,variableName变量名,表达式赋值等号,声明变量后的分号,
functionName函数名(可选,没有的话叫做匿名函数)

语法

var variableName = function functionName(arg){
    //函数体
};

示例1(匿名函数)

var square = function(number) {
  return number * number;
};
var x = square(4); // x 得到的值为16

示例2(函数表达式也可以提供函数名,并且可以用于在函数内部使用来代指其本身,或者在调试器堆栈跟踪中鉴别该函数)

var factorial = function fac(n) {return n<2 ? 1 : n*fac(n-1)};

console.log(factorial(3));
var x = square(4); // x 得到的值为16

需要注意的地方:
使用Function构造函数也可以定义函数,不过因为性能问题不推荐使用,在此仅作了解就好

语法

    var variableName = new Function("arg0","arg1","函数体");
    //函数是对象,函数名是指针,一个函数可能会有多个名字~~
    //当一个对象的属性是函数时,其称之为方法。

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

虽然都可以定义函数,但最大的区别在于:
解析器会率先读取函数声明,使其在执行任何代码之前就可以访问(也就是 函数声明提升);
而函数表达式则需要解析器执行到它所在的代码行才会被解释执行。

sayHi();//能正常运行 弹Hi
sayHi123();//报错 Uncaught TypeError: sayHi123 is not a function(…)

function sayHi(){
    alert("Hi");
}

var sayHi123 = function sayHi(){
    alert("Hi123");
};

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79359.html

相关文章

  • es6必会之let &amp;&amp; const

    摘要:副作用,无副作用可执行和关键词。和不能像一样同一个下声明多次和不会像一样变量声明提升原因是,存在因此不能,赋值前使用变量。 showImg(https://segmentfault.com/img/bVbhPlD?w=1271&h=715); 关键词: let ,const, blocking scope ,temporal dead zone,redeclaration,reassi...

    ygyooo 评论0 收藏0
  • ECMA_作用域深入&amp;This关键字

    摘要:预解析声明告知浏览器在全局作用域中有一个变量名为的变量。执行代码的就是栈内存,作用域也是栈内存。关键字在中主要研究都是函数中的中的代表的是当前行为执行的主体方法,函数,事件中的上下文代表的是当前行为执行的环境区域例如小明在沙县小吃吃蛋炒饭。 基本认识 数据类型 基本数据类型 string, number, null, boolean, undefined 引用数据类型 object: ...

    Harriet666 评论0 收藏0
  • javascript 声明前置与作用域 ( hoisting&amp; Scoping)

    摘要:特别注意的是不用声明的变量那么他归所有也就是全局作用域所有。如果到达全局作用域但是这个变量仍未找到,则会抛出异常。语句结束后,作用域链恢复正常。 1.javascript不管是变量(or 叫变量表达式?或者变量的声明与赋值吧 var scope=loacal)的声明还是函数(or 函数表达式)的声明,都遵循命名在当前作用域前置(提升到当前命名空间顶端)函数体保留在原地。 var sco...

    mmy123456 评论0 收藏0
  • 温故js系列(14)-闭包&amp;垃圾回收&amp;内存泄露&amp;闭包应用&amp;作用域链&

    摘要:该对象包含了函数的所有局部变量命名参数参数集合以及,然后此对象会被推入作用域链的前端。如果整个作用域链上都无法找到,则返回。此时的作用域链包含了两个对象的活动对象和对象。 前端学习:教程&开发模块化/规范化/工程化/优化&工具/调试&值得关注的博客/Git&面试-前端资源汇总 欢迎提issues斧正:闭包 JavaScript-闭包 闭包(closure)是一个让人又爱又恨的somet...

    Amio 评论0 收藏0
  • JavaScript &amp; 6小时了解ES6基本语法

    摘要:返回布尔值,表示参数字符串是否在源字符串的头部。参考语法返回一个布尔值与的全等操作符比较兼容环境把对象的值复制到另一个对象里浅拷贝定义方法用于将所有可枚举的属性的值从一个或多个源对象复制到目标对象。语法要设置其原型的对象。 一步一步似爪牙。 前言 学习es6之前我们可能并不知道es6相比es5差距在哪, 但是这并不妨碍我们站在巨人的肩膀上; 程序员就是要乐于尝鲜; 学习es6最终目的是...

    Amos 评论0 收藏0

发表评论

0条评论

mj

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<