博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数声明和函数表达式
阅读量:5107 次
发布时间:2019-06-13

本文共 1901 字,大约阅读时间需要 6 分钟。

1.函数声明

函数声明以function关键字开头,接着是必须的函数(变量)名和以逗号分隔的可选的参数列表,再接着就是以大括号封装的函数体。函数声明必须是一个单独的JavaScript语句。

基本语法:

function funName(arg1,arg2){ //... }

  

另外,需要注意的是,函数在运行时所有声明变量或声明函数都会被提升到当前函数的顶部。

例如下代码:

console.log('m' in window);//true var m = 0;
 

代码执行时js引擎会将声明语句提升至代码最上方,变为:

 
var m;console.log('m' in window);//truem = 0;

2.函数表达式

在任何情况下都是其它JavaScript语句的一部分(比如赋值表达式等号的右侧、函数的参数)的函数被称为函数表达式。

函数表达式最大的问题,在于js会将此代码拆分为两行代码分别执行。

 

例如下代码:

 
console.log(m);//输出:function m(){}var m=1;function m(){}
 

实际执行的代码为,先将 var m=1 拆分为 var m; 和 m = 1; 两行,再将 var m; 和 function m(){} 两行提升至最上方变成:

 
var m;function m(){}console.log(m);m=1;
 

所以最终函数声明的m覆盖了变量声明的m,输出结果为m函数。

m();//m is not definedvar m = function(){        console.log('n');}    这个例子里虽然变量m声明提前了,但其后面所接函数表达式仍在原来的位置,所以结果会报错。

 

3.比较

//函数声明function myFunctionDeclaration(){  function innerFunction() {}}//以下为函数表达式var myFunc = function(){};myFunc(function(){  return function(){};});(function namedFunctionExpression () { })();+function(){}();-function(){}();!function(){}();~function(){}();

 

myFunctionDeclaration 是一个包含其它函数声明(innerFunction)的函数声明

函数表达式总是其它JavaScript语句的一部分,比如变量声明等号的右侧:

var myFunc = function(){};

或者其他函数的参数:

  myFunc(function() {

   return function(){};

}); 或者立即执行函数:

(function namedFunctionExpression () { })();

或者被为运算符修饰:

 +function(){}();

函数声明与函数表达式除了以代码放的位置不同区别,还有一点不同,那就是函数声明必须有函数名,而函数表达式的函数名可以省略。

函数声明必须有函数名是因为函数被调用的基本要求,在调用一个函数时我们必须能够引用它,而唯一的方法就是通过函数名。

函数表达式是其它JavaScript语句的一部分,所以我们有别的方式引用它们,比如函数被赋值给一个变量,可以通过变量名来访问:

var doNothing = function(){};doNothing(); 或者作为其它函数的参数,可以通过参数名访问:
function doSomething(action) {  action();} 关于立即执行函数:    立即执行函数必须用括号包裹,原因很简单,JavaScript解析器需要区分函数声明和函数表达式,如果省略函数外边的括号,并且直接调用( function(){}(2)此处函数外面没有括号), JavaScript解析器开始解析,并且结束执行,因为这条语句是以function关键字开始,被当作函数声明,由于函数声明必须要有函数名,因此会抛出异常。函数外边的括号会给JavaScript解析器这是一个函数表达式的信号。为了达到相同的目的,也可以这样写: (function (a){}(3)),括号的作用和上面相同。 位运算符的作用和上面也是相同的。
 
 

转载于:https://www.cnblogs.com/Jade-Liu18831/p/9579916.html

你可能感兴趣的文章
关于BOM知识的整理
查看>>
使用word发布博客
查看>>
面向对象的小demo
查看>>
微服务之初了解(一)
查看>>
GDOI DAY1游记
查看>>
收集WebDriver的执行命令和参数信息
查看>>
数据结构与算法(三)-线性表之静态链表
查看>>
mac下的mysql报错:ERROR 1045(28000)和ERROR 2002 (HY000)的解决办法
查看>>
MyBaits动态sql语句
查看>>
HDU4405(期望DP)
查看>>
拉格朗日乘子法 那些年学过的高数
查看>>
vs code 的便捷使用
查看>>
Spring MVC @ResponseBody返回中文字符串乱码问题
查看>>
用户空间与内核空间,进程上下文与中断上下文[总结]
查看>>
JS 中的跨域请求
查看>>
JAVA开发环境搭建
查看>>
mysql基础语句
查看>>
Oracle中的rownum不能使用大于>的问题
查看>>
cassandra vs mongo (1)存储引擎
查看>>
Visual Studio基于CMake配置opencv1.0.0、opencv2.2
查看>>